一、闭包:在函数外也可使用局部变量的特殊语法现象
全局变量 VS 局部变量:
全局变量:优点:可共享,可重用;
缺点:在任意位置都可随意修改——全局污染
局部变量:优点:安全
缺点:不可共享,不可重用
何时使用闭包:即共享局部变量,又不希望随便篡改时。
二、构建一个闭包结构:3步:
1. 使用外层函数封装受保护的局部变量
2. 在外层函数内定义专门操作局部变量的内层函数*并返回*。
3. 在全局调用外层函数,获得内层函数的对象,保存在全局变量中反复使用。
例:
1 function getCounter(){ 2 3 var n=0;//受保护的局部变量 4 5 return function(){ return n++} 6 7 } 8 9 var gerNum=getCounter(); 10 11 /*getNumber接住了return返回的n,getNum引用的函数对象为function(){return n++}*/ 12 13 //调用 14 15 console.log(getNum);//1 16 17 var n=10; 18 19 console.log(getNum);//2
三、闭包三特点:
1. 嵌套函数
2. 内层函数使用了外层函数的局部变量
3. 内层函数对象被返回到外部,在全局反复调用
四、闭包的作用:保护可共享的局部变量
*如何快速判断闭包函数的输出结果:*
1.外层函数调用了几次,就有几个受保护的局部变量
五、经典题
1、
1 function f1(){ 2 var n=999; 3 nAdd=function(){n+=1} 4 function f2(){alert(n);} 5 return f2; 6 } 7 var result=f1(); 8 result(); 9 nAdd(); 10 result();
2、
1 function fun1(){ 2 var arr=[]; 3 4 for(var i=0;;i<3;i++){ 5 arr[i]=function(){return i}; 6 } 7 //i=3 8 return arr; 9 /* 10 function(){return i} 11 function(){return i} 12 function(){return i} 13 */ 14 } 15 var arr=fun1(); //闭包一创建 i=3 16 console.log(arr[0]()); //3 17 console.log(arr[1]()); //3 18 console.log(arr[2]()); //3
3、
1 var getSecret,setSecret; 2 (function(){ 3 var secret=0; 4 getSecret=function(){ 5 return secret; 6 } 7 setSecret=function(sec){//var function setSecret(sec){} 8 secret=sec; 9 } 10 })(); 11 window.secret=100; 12 console.log(getSecret()); //0 13 setSecret(55); 14 console.log(getSecret()); //55