JS中的闭包问题

一、闭包:在函数外也可使用局部变量的特殊语法现象
全局变量 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    
佳物不独来,万物同相携。
原文地址:https://www.cnblogs.com/rongrongtu/p/4991387.html