停止在闭包中通过引用传递

Stop passing by reference in closures

我的代码如下所示:

var a = [];
for(var i = 0; i < 10; i++) {
    a[i] = function() {
        console.log(i);
    }
}

不幸的是,似乎i是通过引用传递的,因此a中的所有函数都输出10。如何使每个函数输出[=11的值=] 有什么时候创建的? IE。 a[0]() 给出 0,a[1]() 给出 1,等等

EDIT:澄清一下,我不希望 a 存储值 0-9。我希望 a 存储 return 值 0-9 的函数。

var a = [];
for(var i = 0; i < 10; i++) {
    a[i] = (function(j) {
        return function () {
            console.log(j);
        }
    })(i);
}

性能更好的版本 -

function makeFunction(i) {
    return function () {
        console.log(i);
    }
}

var a = [];
for(var i = 0; i < 10; i++) {
    a[i] = makeFunction(i);
}

JSFiddle Demo.

您需要调用一个函数(以创建一个捕获您的值的闭包),其中 returns 一个函数(您想要结束的函数)。像这样:

var a = [];
for (var i = 0; i < 10; i++) {
    a[i] = (function(value) {
        return function() {
            console.log(value);
        }
    })(i);
}