JavaScript 关闭。 JS引擎如何选择闭包变量?
JavaScript Closure. How does JS engine choose Closure Variables?
这是JS闭包概念的代码示例。
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)将分别创建变量 j=1,2,3 的新执行上下文在 JS 引擎中。因此,当循环结束时,从 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分别.?
如果我的理解有问题,请帮助我...
函数记录 j
的值。
j
的值是作为参数传递给外部匿名函数的值。
当(立即)调用该函数时指定为 i
的值。
i
一次只有一个值。
when the loops finishes […] the execution context of respective IIFE's will be gone
好吧,他们并没有消失——那是 point of closures。
每个闭包都使它创建的上下文保持活动状态 - 因此您的每个函数都从 各自的范围 引用它们的变量 j
,并具有各自的值。
这是JS闭包概念的代码示例。
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)将分别创建变量 j=1,2,3 的新执行上下文在 JS 引擎中。因此,当循环结束时,从 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分别.?
如果我的理解有问题,请帮助我...
函数记录 j
的值。
j
的值是作为参数传递给外部匿名函数的值。
当(立即)调用该函数时指定为 i
的值。
i
一次只有一个值。
when the loops finishes […] the execution context of respective IIFE's will be gone
好吧,他们并没有消失——那是 point of closures。
每个闭包都使它创建的上下文保持活动状态 - 因此您的每个函数都从 各自的范围 引用它们的变量 j
,并具有各自的值。