五、闭包
JS有两链一包的说法,两链是作用域链和原型链,一包就是闭包。
观察上述代码,调用a函数之后,会在内存中形参红色的区域;另外将a的返回值赋值给了bb,后续垃圾回收机制并不知道bb是否有用,也就是红色内存中的b函数是否有用。所以垃圾回收机制并不会回收红色的区域。
bb ==== b
不知道bb有没有用,也就是不知道b是否有用。所以垃圾回收机制不会清除内存。
这种情形就是闭包,有些时候专门把内部函数b叫做闭包函数。
闭包的特点:
闭包会造成内存不被释放;
闭包使得函数外部可以访问内部的变量。
5.2、闭包应用
每隔1秒,依次输出12345;
//循环所用的时间,可以忽略不计。
for(var i=1; i<=5; i++){
//声明函数
function a(x){
setTimeout(function(){
console.log(x);
}, 1000*x);
}
//调用函数
a(i);
}
//调整后的代码
for(var i=1; i<=5; i++){
//声明函数
(function (x){
setTimeout(function(){
console.log(x);
}, 1000*x);
})(i);
}