为什么我不能滚在Javascript循环?(Why can't I roll a loop

2019-07-29 05:36发布

我正在使用Dojo和具有(一般在我的测试案例6,但变量)了一些关于它的项目小部件的网页上。 我调用dojo.addOnLoad(INIT),在我的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);});

和change事件为我的项目部件正确调用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循环情况。

Answer 1:

这跟倒闭打交道时是一个常见的问题。 试试这个:

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


Answer 2:

i是循环内的局部变量。 当的onChange函数被调用时,所有6个函数都有一个参考到我,这是6。

这是同样的问题,因为乔恩斯基特的C#谜题的页面上#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();
}

其打印所有10的



文章来源: Why can't I roll a loop in Javascript?