一:变量不回收,避免全局变量被覆盖
var data = [];
for (var i = 0; i < 3; i++) {
data[i] = (function (i) {
return function () {
console.log(i);
}
})(i);
}
data[0]();
data[1]();
data[2]();
如上代码中,for循环生成了一个保存着三个函数的数组。
本来var i是全局变量,循环完以后i应该为3
但是data数组的项,是匿名函数每次返回的新函数,且是闭包。闭包中的变量被存在内存中
二:实例
1、下列代码存在几个变量没有被回收( )?
var i = 1;
var i = 2;
var add = function() {
var i = 0;
return function(){
i++;
console.log(i);
}
}();
add();
有3个变量未被回收,分别是i,add函数和return的匿名函数
2、如下的结果?
setTimeout(function () {
this.a= "b";
});
无论严格模式还是非严格模式,浏览器环境下setTimeout内的this永远指向window,执行结果是 window上挂了一个属性window.a,这个值会一直存在,造成内存泄漏。
该代码会正常执行