2009-06-24 21 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的

相关问题