闭包:在一个函数内部,return 出另外一个函数,并且该函数访问了上级函数作用域中的变量。
缺点:内存泄漏(被访问的变量的内存永远无法被销毁)。
(function(){
var count = [];
for(var i = 0;i < 10;i ++){
count[i] = function(){
return i;
}
}
console.log(count[0]());
})();//结果为输出:10
上述的原因为:
count[i] = function(){
return i;
}
只是一个表达式:把该函数赋值给count[i]。所以count[0] = count[1] = ... = count[9] = function(){return i;},当调用时, i 已经为 10。
- 如何解决上述问题
- 通过立即执行函数
- 在立即执行函数中通过定义一个变量保存当前的值
(function(){
var count = [];
for(var i = 0;i < 10;i ++){
count[i] = (function(num){
return function(){
return num;
}
})(i);
}
console.log(count[0]());
})();
或者
(function(){
var count = [];
for(var i = 0;i < 10;i ++){
count[i] = (function(){
var num = i;
return function(){
return num;
}
})();
}
console.log(count[0]());
})();
- 特点:
1.函数中 return 出另一个函数。
2.return 出来的函数,会使用上级函数中的变量。 - 作用:维持一个独立的作用域。