为什么我不能在Javascript中滚动循环?

Car*_*ter 6 javascript dojo closures loops

我正在开发一个使用dojo的网页,并且有一个项目小部件的数字(在我的测试用例中为6,但一般是变量).我正在调用dojo.addOnLoad(ini​​t),在我的init()函数中我有这些行:

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);});
Run Code Online (Sandbox Code Playgroud)

并为我的项目小部件更改事件正确调用makeMatch函数.但如果我用循环替换它们:

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

相同的makeMatch()函数,相同的init()调用,以及其他所有内容 - 只是将我的调用滚动到循环中 - 从不调用makeMatch函数; 对象没有连线.

发生了什么,我该如何解决?我尝试过使用dojo.query,但其行为与for循环案例相同.

mko*_*yak 11

处理闭包时这是一个常见问题.试试这个:

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

  • 得到一本名为"javascript the good parts"的书,你会理解闭包等等. (6认同)

Tom*_*ter 8

我是for循环中的局部变量.当调用onChange函数时,所有6个函数都引用i,即6.

这与Jon Skeet的C#Brainteaser页面上的#4问题相同

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();
}
Run Code Online (Sandbox Code Playgroud)

打印全部10个