Javascript Closures说明

vol*_*ron 6 javascript closures

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

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

闭包的好处:

  1. 使用内部函数将变量封装到本地作用域.该函数的匿名性是微不足道的.

我发现有用的是做一些关于本地/全球范围的基本测试:

<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>
Run Code Online (Sandbox Code Playgroud)

我从中拿出有趣的东西:

  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所注意到的那样.

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

我知道还有其他闭包的例子,其中许多使用匿名函数与循环结构相结合,但我认为这对于101启动课程来看效果是好的.

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

希望这有助于某人,

vol7ron