闭包(closure)理解:
一个普通的函数体代码段在调用时,会随之生成一个局部上下文环境,而这个函数体代码段执行完毕后,这个上下文环境也会随之被销毁。
而一个有闭包函数体代码段在调用时,生成的上下文环境不会在其执行完毕后销毁,而是被其返回对象(函数)继续使用。
特点
闭包函数执行时,生成独立的局部作用域的上下文环境,所以即使是同一闭包函数生成的同名变量,他们存储的位置也是不同的,相互独立的。
优缺点
闭包优点:缓存独立的数据(即使变量名相同),延长作用域链
闭包缺点:因为其特点,增加了内容的开销,资源浪费,不利于垃圾回收机制。
闭包分为两种
返回值(函数或对象)闭包
利用局部作用域变量做闭包,缓存不同的独立数据。
function fn(){
var num = 10
return function (){
num++
console.log(num)
}
}
var f = fn()
f()
var f2 = fn()
f2()
参数闭包
利用参数缓存形成闭包,延长作用域链到异步函数执行完毕。
for(var i = 0;i<3;i++){
fn(i)//1,2,3
}
function fn(i){
setTimeout(function(){
console.log(i)
},0)
}