今天特地抽出时间又来研究了一次,我们的老朋友,闭包
js 闭包最主要的特性,就是能够保持包含它的函数的数据状态,导致这种特性原因正是引用
我对闭包的理解:子函数,用了父函数的东西,儿子将父亲的东西据为己有,且还需要父亲一直陪着,(儿子就是任性)
//例子1:
var obj = {};
for(var i =0;i < 2;i++){
obj[i] = function(){
alert(i);
};
}
//上述for循环中的两个闭包,都指向了全局的[i]
obj[0](); //2
obj[1](); //2
//例子2:
var obj = {};
for(var i =0;i < 2;i++){
obj[i] = function(ii){ //闭包1
return function(){ //闭包2
alert(ii);
}
}(i);
}
obj[0](); //0
obj[1](); //1
//例子2,闭包2引用了闭包1 的参数,因此闭包1的数据状态会一直被保持,这正是闭包的特性
//例子2是参数引用触发的闭包特性,我们还可以用局部变量来保持数据,看下面的例子3
//例子3
var obj = {};
for(var i =0;i < 2;i++){
(function(){ //闭包1
var ii = i; //局部变(是关键)
obj[i] = function(){ //闭包2
alert(ii)
}
})();
}
obj[0](); //0
obj[1](); //1
//例子4,我们还可以让函数自己去保存数据
var obj = {};
for(var i =0;i < 2;i++){
(obj[i] = function(){
alert(arguments.callee.value);
}).value = i;
}
obj[0](); //0
obj[1](); //1
在闭包特性给我们带来方便的同时,我们因该理性的酌情使用,不要乱用,避免内存泄露,
如上述例子2,3中,如果obj这个对象,一直存在全局变量中,没有销毁的机会,就有可能造成内存泄露 特别在服务器端
为了避免这样的现象,我们可能还需要手动的
delete obj[0];
delete obj[1];