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

tld*_*ldr 1 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]());
Run Code Online (Sandbox Code Playgroud)

打印出3,3,3.我不明白为什么.我正在将'i'的值复制到局部变量x,所以应该有三个x:x0 = 0,x1 = 1.X2 = 2.他们如何阅读i的最终价值?

Ted*_*opp 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;
    }
}
Run Code Online (Sandbox Code Playgroud)