这是JS Closure概念的代码示例。
function buildFunctions() {
var arr = [];
for (var i = 0; i < 3; i++) {
arr.push((function(j) {
return function() {
console.log(j);
}
}(i)));
}
return arr;
}
var fn = buildFunctions();
fn[0]();
fn[1]();
fn[2]();
在这段代码中,我知道循环何时开始运行,并且对于每个“i”值(对于每个 IIFE),将在 JS 引擎中分别创建变量 j=1,2,3 的新执行上下文。因此,当循环结束时,从 3 IIFE 返回的三个函数将位于 var arr 中,并且相应 IIFE 的执行上下文将消失,但在闭包中仍然具有 j=1,2,3 的变量环境。所以,现在 arr 将有
var arr = [function{console.log(j)},function{console.log(j)},function{console.log(j)}]
我的问题是如何在数组中调用这些函数,fn[0]()
选择 j=0,fn[1]()
选择 j= 1、fn[2]()
分别从闭包中选取j=2。?
如果我的理解有问题,请帮助我......
最佳答案
when the loops finishes […] the execution context of respective IIFE's will be gone
好吧,他们并没有消失 - 这就是 point of closures .
每个闭包都会保留其创建时的上下文 - 因此每个函数都从各自的范围中引用其变量j
,并具有各自的值。
关于JavaScript 闭包。 JS引擎如何选择闭包变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968839/