• 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    
    佳物不独来,万物同相携。
  • 相关阅读:
    Docker的使用
    单元测试框架--Mocha
    Typescript-规范
    Docker Hello World
    node项目的基本构建流程或者打开一个node项目的流程
    node.js安装及初用
    windows系统安装MongoDB
    微信小程序实现滚动视频自动播放(未优化)
    js判断一个字符串中出现次数最多的字符及次数
    vue相关知识点及面试
  • 原文地址:https://www.cnblogs.com/rongrongtu/p/4991387.html
Copyright © 2020-2023  润新知