JS中闭包的含义

一个新手
一个新手原创
2017-09-11 10:34:46899浏览


闭包(Closure)

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

如何创建闭包

最常见的就是在一个函数内部创建另外一个函数。以TrialFunction()函数为例:

function TrialFunction(property) {

      return function(a, b) {
           var a1 = a[property];           var b1 = b[property];           if (a1 < b1) {                return -1;
           } else if (a1 > b1) {                return 1;
           } else {                return 0;
           }
      };
}

上述代码中,内部函数访问了外部函数中的变量property。即使这个内部函数被返回了,而且在其他地方被调用了,它人仍然可以访问property变量。

这种情况是因为,这个内部函数的作用域链包含了TrialFunction的作用域。

当某个函数被调用时,会创建一个执行环境(Execution Context)及相应的作用域链。随后,使用arguments和其他命名参数的值来初始化函数的活动对象(Activity Object)。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,最后直至作为作用域链的全局执行环境。

在函数执行过程中,为读取和写入变量的值,就需要在作用域链中查找变量。

作用域链的这种机制导致了一个副作用,那就是闭包只能取得包含函数中任何变量的最后一个值。
例如:

function example() {
   var result = new Array();  
   for (var i = 0; i < 10; i++) 
   {
      result[i] = function() 
      {
         return i;
      }
   }   return result;
}

这个函数会返回一个数组,一般大家会认为,每个函数都应该返回自己的index,即[0, 1, 2, ……9];但是实际上每个函数都返回的是10。

以上就是JS中闭包的含义的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。