码迷,mamicode.com
首页 > Web开发 > 详细

js-我理解的闭包

时间:2016-03-03 19:30:29      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

一:什么是闭包  

  《JS高级程序设计》指出:闭包是指有有权访问另一个函数作用域中变量的函数。

二:闭包的使用

   闭包的常见的创建方式是 子函数嵌套在父函数的内部,这样,子函数就可以访问父函数中的变量。

 1       function add(){
 2             var a=1;
        //暂且叫 innerAdd 函数        
3 return function(){ 4 a++; 5 console.log(a); 6 } 7 } 8 add()(); 9 add()(); 10 console.log("------------------------"); 11 var addAfter=add(); 12 addAfter(); 13 addAfter();

     8行---- 2

     9行-----2

      12,13行 ---2,3

   那么,为什么第9行得到的结果仍然是2,而不是期待中的3呢?

     这里因为JS里也有 C# Java里中的 垃圾回收 机制。

    (1) 函数未被引用,执行完后,该函数作用域就会被回收。

    (2)函数如果被其他变量引用,该函数作用域就会被保存下来。

    第8,9行,add()函数并没有被其他变量引用,只是简单的执行,因此,a的作用域只存在该函数中。

    11行,add()函数被外部变量 addAfter引用,函数中的a的值被保存在内存中。

      可以这样说:如果innerAdd函数被父亲函数add之外的函数所引用,这样就形成了一个闭包,否则,是不能形成闭包的。

    还有另外一种使用形式:

1        var addMatch=(function(){
2             var a=22;
3             return function(){
4                 a++;
5                 console.log(a);
6             }
7         })();
8         addMatch();
9         addMatch();

三:闭包的问题

  闭包只能取得包含函数中的最后一个变量值,保存的是整个变量对象,而不是某个特殊的变量。

1         var arr1=[12,19,3],arr2=[],arrLength=arr1.length;
2         for(var i=0;i<arrLength;i++){
3             arr2[i]=function(){
4                 console.log(i);
5                 return i;
6             };
7         } 

 

四:闭包的应用场景

js-我理解的闭包

标签:

原文地址:http://www.cnblogs.com/xianrongbin/p/2860410.html

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