2012-06-18 49 views
1

我確定有一個非常簡單的解決方案,但是我無法圍繞它進行包裝。我想,像這樣內的創建和對象的數組循環:嘗試在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和酒吧出現在靠前的代碼中聲明作爲全局變量。

它工作正常,如果我創建foos作爲foos [0]和通過酒吧[0]訪問。我懷疑它的東西做功能級別的作用域,但據我所看到的陣列應該是全局對象上訪問....

+3

這是因爲你想設置foo [我] .a而不是foos [i] .a在foobar函數中? – dougajmcdonald

+0

@dougajmcdonald嗯。我們都立即想到了一個關閉問題,但它可能只是一個錯字... –

+2

您的語法無效。那麼'foobar ='不能用對象直接表示法 – 2012-06-18 19:27:40

回答

3

您需要「錨定」i的值。要做到這一點......

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

完美的歡呼隊友 - 以及對其他人的迴應 – mattholl

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; 
     } 
    })); 
} 
+0

這是'foobar'處理程序中的範圍問題。使用'.push'在這裏沒有幫助。 – 2012-06-18 19:25:12

0

我在價值foob​​ar的執行是循環結束時的那個(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; 
     } 
    }); 
} 

或者使用一箇中間封閉在循環附上我:

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); 
} 

第一個解決方案是更加明確,二是也許現在更常見。

0

由於「foo [i]」未定義,您不能設置未定義的值「a」。你從來沒有定義foo [i]。你的意思是說我可以嗎?另外,正如其他人所說,你的函數foobar將爲你創建的每個對象使用相同的值i。你應該創建一個新的封閉與我,這將允許您定義一個局部變量我可以是不同的每個內部功能,如下所示:

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