解释为什么此闭包在迭代时返回值

时间:2011-07-30 14:28:29

标签: javascript closures

  

可能重复:
  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;
}
}

我需要解释的那里有一点太多了。

1 个答案:

答案 0 :(得分:1)

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

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

只涉及一个ifor循环结束后,i的值为2,无论调用哪个a[i]函数。

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

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

现在迭代时间的i被映射到每次迭代的全新x,而函数(1)确保它被“捕获”直到a[i](2)被执行。