Javascript Closures说明

时间:2010-06-16 20:16:41

标签: javascript closures

问题: 闭包似乎有很多好处,但有什么负面影响?另外,我对闭包的理解是否正确?最后,一旦创建了闭包,它们会被销毁吗?

我一直在阅读有关Javascript Closures的一些信息。我希望有一点知识渊博的人会指导我的断言,纠正错误的地方。

关闭的好处:

  1. 使用内部函数将变量封装到本地作用域。 这个函数的匿名性是微不足道的。
  2. 我发现有用的是做一些关于本地/全球范围的基本测试:

    <script type="text/javascript">
    
       var global_text  = "";
       var global_count = 0;
       var global_num1  = 10;
       var global_num2  = 20;
       var global_num3  = 30;
    
       function outerFunc() {
    
          var local_count = local_count || 0;
    
          alert("global_num1: " + global_num1);    // global_num1: undefined
          var global_num1  = global_num1 || 0;
          alert("global_num1: " + global_num1);    // global_num1: 0
    
          alert("global_num2: " + global_num2);    // global_num2: 20
          global_num2  = global_num2 || 0;         // (notice) no definition with 'var'
          alert("global_num2: " + global_num2);    // global_num2: 20
          global_num2  = 0;
    
          alert("local_count: " + local_count);    // local_count: 0
    
          function output() {
             global_num3++;
    
             alert("local_count:  " + local_count  + "\n" +
                   "global_count: " + global_count + "\n" +
                   "global_text:  " + global_text
                  );
    
             local_count++; 
          }
    
          local_count++;
          global_count++;
    
          return output;  
       }  
    
       var myFunc = outerFunc();
    
       myFunc();
          /* Outputs:
           **********************
           * local_count:  1
           * global_count: 1
           * global_text: 
           **********************/
    
       global_text = "global";
       myFunc();
          /* Outputs:
           **********************
           * local_count:  2
           * global_count: 1
           * global_text:  global
           **********************/
    
       var local_count = 100;
       myFunc();
          /* Outputs:
           **********************
           * local_count:  3
           * global_count: 1
           * global_text:  global
           **********************/
    
    
       alert("global_num1: " + global_num1);      // global_num1: 10
       alert("global_num2: " + global_num2);      // global_num2: 0
       alert("global_num3: " + global_num3);      // global_num3: 33
    
    </script>
    

    我从中获取了有趣的东西:

    1. outerFunc中的警报只调用一次,即将outerFunc调用分配给myFunc(myFunc = outerFunc())。这个赋值似乎保持outerFunc打开,我想称之为持久状态。

    2. 每次调用myFunc时,都会执行返回。在这种情况下,返回是内部函数。

    3. 真正有趣的是定义局部变量时发生的本地化。注意global_num1和global_num2之间的第一个警报的差异,即使在尝试创建变量之前,global_num1也被认为是未定义的,因为'var'用于表示该函数的局部变量。 - 之前已经讨论过这个问题,按照Javascript引擎的操作顺序,很高兴看到它投入使用。

    4. 仍然可以使用Globals,但局部变量会覆盖它们。注意在第三次myFunc调用之前,创建了一个名为local_count的全局变量,但它对内部函数没有影响,内部函数有一个同名的变量。相反,每个函数调用都能够修改全局变量,正如global_var3所注意到的那样。

    5. 发表想法: 尽管代码很简单,但是对于你们来说警报很混乱,所以你可以即插即用。

      我知道还有其他闭包的例子,其中很多都使用匿名函数和循环结构,但我认为这对101启动课程来说很有效。

      我关注的一件事是关闭对内存产生的负面影响。因为它使函数环境保持打开,所以它还将这些变量保存在内存中,这可能/可能没有性能影响,尤其是关于DOM遍历和垃圾收集。我也不确定这会在内存泄漏方面发挥什么样的作用,我不确定是否可以通过简单的“删除myFunc;”从内存中删除闭包。

      希望这有助于某人,

      vol7ron

0 个答案:

没有答案