1

看看这段代码:

var arr = new Array();
for (var i = 0; i < 10; i++) {
    arr[i] = {
        func:function() {
            console.log(i);
        }
    }
}
arr[0].func();

我对此感到困惑,因为我认为这会起作用。我基本上希望数组中的每个对象都打印创建函数时给出的值。

现在当我打电话时func(),它会在控制台中打印 10 。有没有办法让它打印出来0, 1, 2, 3, 4, 5, 6, 7, 8, 9?谢谢!

4

3 回答 3

1

问题是内部的函数引用了每次都会增加的变量“i”。您可以将每次迭代中“i”的值存储在函数旁边的对象中,如下所示:

http://jsfiddle.net/Sgnvp/

var arr = new Array();
for (var i = 0; i < 10; i++) {
    arr[i] = {
        func:function() {
            console.log(this.value);
        },
        value: i
    }
}
arr[0].func();
于 2013-05-06T02:13:02.437 回答
0

您必须创建一个闭包来封装该值。我在这里打电话consoleIt并通过它iconsoleIt围绕i

var arr = [];

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

for (var i = 0; i < 10; i++) {
    arr[i] = { 
        func: consoleIt(i)
    };
}

arr[0].func();
于 2013-05-06T02:18:48.657 回答
0

这实际上并不比 thebreiflabb 的做法更好,但这是一项值得了解的有趣技术:

    var arr = [];

    for (var i = 0; i < 10; i++){

      (function(i){
        arr[i] = {
          func : function(){
            console.log(i); 
          }
        };
      })(i);

    }

    arr[0].func();

它只是使用匿名闭包来限定 i。

于 2013-05-06T02:19:13.777 回答