Javascript中的闭包:分配局部变量不起作用

时间:2013-05-27 01:43:11

标签: javascript closures

就在我认为我理解封闭的时候......

以下代码段:

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的最终价值?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:4)

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

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