1

就在我以为我理解闭包的时候......

以下代码片段:

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

var a = f();
console.log(a[0]());
console.log(a[1]());
console.log(a[2]());

打印出 3、3、3。我不明白为什么。我将'i'的值复制到局部变量x,所以应该有三个x:x0=0,x1=1。x2=2。他们都是如何读取 i 的最终值的?

4

2 回答 2

5

a[i]实际上,您的问题是由每个存在引起的。它们都共享相同的i,在每个a[i]被调用时进行评估,而不是在循环执行时进行评估。您需要使用单独的上下文创建每个闭包。例如:

function f() {
    var a = [];
    var i;
    for (i = 0; i < 3; i++) {
        a[i] = makeClosure(i);
    }
    return a;
}
function makeClosure(i) {
    return function () {
        var x = i;
        return x;
    }
}
于 2013-05-27T01:48:07.890 回答
4

即使循环i中的值发生了变化for,它仍然是同一个i变量。您需要i在该范围内隐藏并有效地按值传递它:

for (var i = 0; i < 3; i++) {
    (function(x) {
        a[x] = function() {
            return x;
        }
    })(i);
}
于 2013-05-27T01:47:24.147 回答