js-我理解的闭包

Posted 鲜荣彬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js-我理解的闭包相关的知识,希望对你有一定的参考价值。

一:什么是闭包  

  《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-我理解的闭包的主要内容,如果未能解决你的问题,请参考以下文章

JS闭包的概念

知识深入理解js闭包

javascript深入理解js闭包

javascript深入理解js闭包

javascript深入理解js闭包

javascript深入理解js闭包