function f1(){
var n=1;//一直保存在内存中
test=function(){
n+=1;
};
function f2(){
alert(n);
}
return f2;
}
var res=f1();//1
alert(res());//undefined
test();//2
alert(res());//undefined
//闭包函数坐在的函数,一直在内存中,不会被回收
var setValue,getValue;
(function(){
var n=0;
getValue=function(){
return n;
};
setValue=function(){
n=x;
}
})();
//alert(n);//not undefined
alert(getValue());//0
setValue(50);
alert(getValue());//50
//迭代器中的应用
function test(){
var i=0;
return function(){
returnx[i++];
};
}
var next=test(['a','b','c']);
alert(next());//a 0
alert(next());//b 1
alert(next());//c 2
function f(){
var a[];
var i;
for(i=0;i<3;i++){
a[i]=function(){
return i;
};
}
return a;
}
var test=f();
alert(test[0]());//3
alert(test[1]());//3
alert(test[2]());//3
//解决方案
function f(){
var a[];
var i;
for(i=0;i<3;i++){
a[i]=(function(x){
return function(){
return x
}
})(i);
}
return a;
}
var test=f();
alert(test[0]());//0
alert(test[1]());//1
alert(test[2]());//2
另一种方式实现
function f(){
function test(x){
return function(){
return x;
}
}
var a=[];
var i;
for(i=0;i<3;i++){
a[i]=test(i);
}
return a;
}
var res=f();
alert(res[0]());//0
alert(res[1]());//1
alert(res[2]());//2
闭包:变量保存在内存中,内存消耗大。IE中可能导致内存泄漏。在退出函数之前,将不使用的局部变量删除。
闭包会在父函数外部,改变父函数内部变量的值。如果把父函数当对象使用,把闭包当作公用方法,把内部变量当作私有属性,不要轻易改变父函数内部变量的值。