【问题标题】:Explanation of why this closure returns the value at the time of the iteration [duplicate]解释为什么这个闭包在迭代时返回值[重复]
【发布时间】:2011-07-30 14:28:28
【问题描述】:

可能重复:
How do JavaScript closures work?

我知道人们对闭包的一个问题是它返回给定变量的最新值,除非你这样做:

function f() {
    var a = [];
    var i;

    for (i = 0; i < 3; i++) {
        a[i] = (function (x) {
            return function () {
                return x;
            }
        })(i);
    }
    return a;
}
}

那里发生的事情太多了,我需要解释一下。

【问题讨论】:

  • 请具体说明您的问题。你现在应该已经知道了。
  • 您添加的} 似乎太多了。
  • 查看这个问题以获得关于闭包如何在 javascript stackoverflow.com/questions/111102/… 中工作的一个很好的解释
  • @Blankman:如果将 IIFE (function (x) { return func... })(i); 替换为在循环中调用的 named 函数,您可能会发现更容易理解:for(i=0...){some_func(i);}。然后some_func 将接收i,定义为参数x,并返回一个引用x 的函数。 function some_func( x ) { return function(){ return x; }; }

标签: javascript closures


【解决方案1】:

在 JavaScript 中,变量的范围始终是 function(或全局对象)。所以,如果你做类似的事情

for (var i = 0; i < 3; i++) {
    a[i] = function (x) {
        return i;
    };
}

只有一个i 参与其中。在for循环结束后,i的值是2,无论调用哪个a[i]函数。

要解决这个问题,我们需要建立一个新的范围。通常这是通过调用匿名函数来完成的:

a[i] = (function (x) { // (1)
    return function () { //  (2)
        return x;
    };
})(i);

现在,迭代时的 i 每次迭代都会映射到一个全新的 x,并且函数 (1) 确保它被“困住”,直到 a[i] (2) 被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2017-06-15
    • 1970-01-01
    • 2015-10-10
    • 2013-10-22
    • 2013-12-25
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多