JavaScript关闭。 JS引擎如何选择Closure Variables?

时间:2016-01-23 21:03:45

标签: javascript closures ecmascript-5

这是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。 ?

如果我的理解有问题,请帮助我......

2 个答案:

答案 0 :(得分:3)

  

当循环结束时,各个IIFE的执行上下文将消失

嗯,他们没有离开 - 那就是point of closures 每个闭包都将其创建的上下文保持为活动状态 - 因此每个函数都会从各自的范围中引用其变量j,并具有相应的值。

答案 1 :(得分:1)

该函数记录j的值。

j的值是作为外部匿名函数的参数传递的值。

当({立即)调用该函数作为i的值时指定。

i一次只有一个值。