js闭包
作用域链
词法作用域
// function a(){
// alert('aaa');
// return function(){
// alert('bbb');
// };
// }
// var func=a();
// func();
// var a=function(){
// function setUp(){
// var setup='doSomeThing';
// }
// function doWhat(){
// alert('要执行的操作');
// }
// setUp();
// return doWhat;
// }();
// a();
// 作用域链
// var a=1;
// function test(){
// var b=2;
// function test1(){
// var c=3;
// alert(a);
// alert(b);
// alert(c);
// return c;
// }
// test1();
// }
// test();
// 词法作用域
// function f1(){
// var a=1;//局部变量
// return f2();
// }
// function f2(){
// return a;
// }
// alert(f1());
// 通过闭包突破全局作用域链
// function f(){
// var a='unclehuang';
// return function(){
// return a;
// }
// }
// var test=f();
// alert(test());
// var n;
// function f(){
// var a='unclehuang';
// n=function(){
// return a;
// };
// }
// f();
// alert(n());
// function f(param){
// var n=function(){
// return param;
// }
// param++;
// return n;
// }
// var test=f(12);
// alert(test());
// function f1(){
// var n=1;
// test=function(){
// n+=1;
// }
// function f2(){
// alert(n);
// }
// return f2;
// }
// var res=f1();
// alert(res());
// var setValue,getValue;
// (function(){
// var n=0;
// getValue=function(){
// return n;
// };
// setValue=function(x){
// n=x;
// };
// })();
// alert(getValue());
// setValue(12);
// alert(getValue());
// function test(x){
// var i=0;
// return function(){
// return x[i++];
// };
// }
// var next=test(['a','b','c','d']);
// alert(next());
// alert(next());
// alert(next());
// alert(next());
// 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]());
// alert(test[1]());
// alert(test[2]());
// 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]());
// alert(test[1]());
// alert(test[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]());
alert(res[1]());
alert(res[2]());
注意:
1.闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。尽量在退出函数之前,将不使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公有方法(public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。