这是JS Closure概念的代码示例。JavaScript关闭。 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的三个返回函数将位于变量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]()
镐Ĵ分别= 2从封闭。?
如果事情是错误的,我的理解,请帮我...
每个闭包都是一个单独的对象,并且完全可以访问其范围内的'y'变量。请注意,在多个作用域(每次调用IEFE创建的)中都有多个'y'变量(具有不同的值)。 – Bergi
@Bergi我可以想一想,每一轮推动创建一个容器(封闭)在.push被调用并将所有局部变量放入它并将该容器的引用传递给函数get push? – Kuan
是的,但是*范围*(IIFE)是容器,函数(带有引用)就是所谓的“闭包”。 – Bergi