尝试在for循环中创建对象

时间:2012-06-18 19:08:50

标签: javascript

我确信这有一个非常简单的解决方案,但我无法绕过它。我正在尝试在for循环中创建对象数组,如下所示:

for(var i = 0; i < 100; i++) {
    foos[i] = new Foo(i*10);
    bars[i] = someObject.createBar({
         x : 0,
         y : 0,
         foobar = function() {
              foo[i].a = true;
         }
    });
}

当试图运行它时,我得到'无法设置未定义的属性',foos和bars都在代码中作为全局变量声明。

如果我将foos创建为foos [0]并通过bars [0]访问它,它可以正常工作。我怀疑它与函数级别范围有关,但据我所知,数组应该可以在全局对象上访问....

4 个答案:

答案 0 :(得分:3)

您需要“锚定”i的值。要做到这一点......

for(var i=0; i<100; i++) {
    (function(i) {
        // now do stuff with i
    })(i);
}

答案 1 :(得分:0)

试试这个:

for(var i = 0; i < 100; i++) { 
    foos.push( new Foo(i*10) ); 
    bars.push( someObject.createBar({ 
         x : 0, 
         y : 0, 
         foobar = function() { 
              foo[i].a = true; 
         } 
    }) ); 
} 

答案 2 :(得分:0)

执行foobar时i的值是循环结束时的值(100)。因为循环块是一个闭包。

您最好存储所需的值。例如:

for(var i = 0; i < 100; i++) {
    foos[i] = new Foo(i*10);
    bars[i] = someObject.createBar({
         x : 0,
         y : 0,
         i : i,
         foobar: function() {
              foos[i].a = true;
         }
    });
}

或者在循环中使用中间闭包来包含i:

for(var i = 0; i < 100; i++) {
    (function(i){
        foos[i] = new Foo(i*10);
        bars[i] = someObject.createBar({
             x : 0,
             y : 0,
             foobar: function() {
              foos[i].a = true;
             }
        });
    })(i);
}

第一个解决方案更明确,第二个解决方案可能现在更常见。

答案 3 :(得分:0)

您不能设置未定义的值“a”,因为“foo [i]”未定义。你从未定义过foo [i]。你的意思是foos [i],也许?

另外,正如其他人所说,你的函数foobar将为你创建的每个对象使用相同的i值。你应该用i创建一个新的闭包,它允许你定义一个局部变量i,它对于每个内部函数可以是不同的,如下所示:

for(var i=0; i<100; i++) {
   (function(i) {
      // now do stuff with i
   })(i);
}