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,并具有各自的值。