+发表新主题
查看: 1588|回复: 0

[代码片段] js 闭包

[复制链接]

[代码片段] js 闭包

[复制链接]
木钟无仁 发表于 2016-1-4 21:57:09 浏览:  1588 回复:  0 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
.闭包:

         全局变量:在程序任何位置都可访问(修改)

       问题:存在全局污染



  •    //全局污染
  •   var n=0;
  •   function getNum(){
  •        return ++n;
  •   }
  •   console.log(getNum());
  •   console.log(getNum());
  •     n=100;
  •   console.log(getNum());  console.log(getNum());

复制代码
214822jmkkr03866zjl162.png

   


      局部变量:不可重用!



  • //局部变量
  • function getNum(){
  • var n=0;
  • return ++n;
  • }
  • console.log(getNum());
  • console.log(getNum());
  • n=100;console.log(getNum());

复制代码
214822jmkkr03866zjl162.png

     解决:即要重用变量,又要保护变量不被污染,则使用闭包

     如何创建闭包:

                  1. 先用外层函数封装一个受保护的局部变量

        2. 再在内层函数中操作外层函数的变量

        3. 外层函数将内层函数返回到外部,在外部反复调用。



  • //闭包
  •     function outer(){
  •        var n=0;
  •    return function(){return ++n;}
  •    }
  •    var getNum=outer();
  •     //getNum:function(){return ++n;}
  •    console.log(getNum());
  •    console.log(getNum());
  •    n=10;
  •    console.log(getNum());   console.log(getNum());

复制代码
214822jmkkr03866zjl162.png

      

         如何判断是否是闭包:

           1. 函数嵌套!

           2. 内层函数使用外层函数的局部变量

           3. 内层函数被返回到外部,在外部调用。


      何时使用闭包:即要重用变量,又要保护变量不被污染

      缺点:占用更多内存空间——因为outer的活动对象无法释放。

   

     判断闭包输出:

       1. 同一次外层函数调用返回的内层函数,操作同一个变量

       2. 外层函数调用了几次,就有几个受保

例如:


  • //闭包练习
  •         function outer(){
  •                 for(var i=0,arr=[];i<3;i++){
  •                   arr=function(){return i};//i是受保护的变量
  •                 }
  •                 //循环结束后,i=3
  •                 return arr;
  •         }
  •         var getFuns=outer();
  •         //只有1个受保护的变量i=3
  •             //getFuns:[
  •                                 //function(){return i},
  •                                 //function(){return i},
  •                                 //function(){return i}
  •                     //]
  •         console.log(getFuns[0]()); //3
  •         console.log(getFuns[1]()); //3        console.log(getFuns[2]()); //3

复制代码
214822jmkkr03866zjl162.png
回复

使用道具 举报


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版| 赣南网

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4

用微信扫一扫

赣南网