码迷,mamicode.com
首页 > 其他好文 > 详细

了解闭包的两个实例

时间:2016-06-14 15:47:19      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

闭包:有权访问另一个函数作用域中的变量的函数

闭包作用:读取函数内部变量;保护变量不被销毁

 

例子1

    函数可以读取全局变量

<script style="text/javascript">
  var n=999;
  function f1(){
  alert(n)
}
f1()     //999
</script>

    在函数外部无法读取函数内部的局部变量

<script style="text/javascript">
 
  function f1(){
  var n=999;
  }
alert(n)     //error
</script>

    在函数内部再创建一个函数,可以访问内部变量

<script style="text/javascript">
 
  function f1(){
     var n=999;
     function f2(){
         alert(n);   //999
  }
</script>

     把f2作为返回值,就可以在f1外部访问f1内部变量

<script style="javascript">
      function f1(){
         var n=999;
         function f2(0{
             alert(n);
         }
         return f2;
       }
       var result=f1();
       result();       //999
</script>

 

 

例子2

作用域链的这种配置机智引出的一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值

<html>
<head>
        <script style=text/javascript>
               for(var i=0;i<10;i++){
               setTimeout(function(){
               console.log(i);                           结果:10
          })         
        </script>
         <script style=text/javascript>
for(i=0;i<10;i++){ (function(a){ setTimeout(function(){ console.log(a); 结果:0,1,2,3,4,5,6,7,8,9 },1000) })(i);
}
</script> </head> </html>

          之所以会这样,是因为 setTimeout 中的 i 是对外层 i 的引用。当 setTimeout 的代码被解释的时候,运行时只是记录了 i 的引用,而不是值。而当 setTimeout 被触发时, setTimeout 中的 i 同时被取值,由于它们都指向了外层的同一个 i,而那个               i 的值在迭代完成时为 10,所以打印了五次 `10`。
          为了得到我们预想的结果,我们可以把 i 赋值成一个局部的变量,从而摆脱外层迭代的影响。

了解闭包的两个实例

标签:

原文地址:http://www.cnblogs.com/LittleGirl-mm/p/5584106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!