闭包是指有权访问另一个函数作用域中的变量的函数。
最常见的就是在一个函数内部创建另外一个函数。以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中文网其他相关文章!