Car*_*ter 6 javascript dojo closures loops
我正在开发一个使用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);});
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)
我是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个
| 归档时间: |
|
| 查看次数: |
820 次 |
| 最近记录: |