2009-06-24 49 views
6

我正在使用dojo的網頁上工作,並在其上有一個數字(在我的測試用例中是6個,但一般情況下是可變的)。我調用dojo.addOnLoad(INIT),在我的init()函數我有這行:爲什麼我不能在Javascript中滾動循環?

dojo.connect(dijit.byId("project" + 0).InputNode, "onChange", function() {makeMatch(0);}); 
dojo.connect(dijit.byId("project" + 1).InputNode, "onChange", function() {makeMatch(1);}); 
dojo.connect(dijit.byId("project" + 2).InputNode, "onChange", function() {makeMatch(2);}); 
dojo.connect(dijit.byId("project" + 3).InputNode, "onChange", function() {makeMatch(3);}); 
dojo.connect(dijit.byId("project" + 4).InputNode, "onChange", function() {makeMatch(4);}); 
dojo.connect(dijit.byId("project" + 5).InputNode, "onChange", function() {makeMatch(5);}); 

,並更改事件爲我的項目部件正確調用makeMatch功能。但是,如果我有一個循環替換它們:

for (var i = 0; i < 6; i++) 
    dojo.connect(dijit.byId("project" + i).InputNode, "onChange", function() {makeMatch(i);}); 

相同makeMatch()函數,相同的init()調用,同一切 - 只滾動我的電話成一個圈 - 中makeMatch功能不會被調用;物體沒有連線。

這是怎麼回事,我該如何解決?我試過使用dojo.query,但其行爲與for循環的情況相同。

回答

11

這是一個常見的問題在處理關閉時。試試這個:

for (var i = 0; i < 6; i++) { 
    (function(i){ 
     dojo.connect(dijit.byId("project" + i).InputNode, "onChange", function() {makeMatch(i);}); 
    }(i)); 
} 
+0

優秀;謝謝;這工作完美。我認爲了解封閉需要很長時間。 – 2009-06-24 17:18:30

8

我是for循環中的局部變量。當的onChange函數被調用時,所有6個函數都有一個參考到我,這是6

它作爲#4 on Jon Skeet's C# Brainteaser's page

List<Printer> printers = new List<Printer>(); 
for (int i=0; i < 10; i++) 
{ 
    printers.Add(delegate { Console.WriteLine(i); }); 
} 

foreach (Printer printer in printers) 
{ 
    printer(); 
} 

了同樣的問題,其打印所有10的

相關問題