JavaScript 闭包。 JS引擎如何选择闭包变量?

标签 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 返回的三个函数将位于 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。?

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

最佳答案

when the loops finishes […] the execution context of respective IIFE's will be gone

好吧,他们并没有消失 - 这就是 point of closures .
每个闭包都会保留其创建时的上下文 - 因此每个函数都从各自的范围中引用其变量j,并具有各自的值。

关于JavaScript 闭包。 JS引擎如何选择闭包变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968839/

相关文章:

javascript - 从返回的函数中调用 function.apply 不传递参数

javascript - 从调用 forEach() 数组方法的方法返回。 JavaScript

javascript - 如何为语言变化做好准备?

javascript - ES5中如何让构造函数指向 super 函数原型(prototype)

javascript - 为什么 watch 任务在 gulp 中终止已经使用 gulp-plumber 插件?

javascript - 制作 Backbone.js View 以在 Canvas 上绘制对象

swift - 将函数包装在闭包中以将其作为参数传递是否有任何开销

swift - 在 Swift 中重用闭包

JavaScript 检查回文(包括空格和标点符号)

javascript - 如何暂停动画