这是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的三个返回函数将位于变量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。 ?
如果我的理解有问题,请帮助我......
答案 0 :(得分:3)
当循环结束时,各个IIFE的执行上下文将消失
嗯,他们没有离开 - 那就是point of closures
每个闭包都将其创建的上下文保持为活动状态 - 因此每个函数都会从各自的范围中引用其变量j
,并具有相应的值。
答案 1 :(得分:1)
该函数记录j
的值。
j
的值是作为外部匿名函数的参数传递的值。
当({立即)调用该函数作为i
的值时指定。
i
一次只有一个值。