循环中的闭包/回调
Closure/callback in for loop
可能重复:
Javascript循环中的事件处理程序-需要闭包吗?
一段时间以来,我一直在努力让它发挥作用,并决定提出要求。
我有以下内容:
function doSomething(var1, var2) {
dojo.xhrGet({
url:"somUrl",
content: {value1:var1,value2:var2},
preventCache: true,
handleAs:"json",
load: function(response){
for(var i in response.myObject) {
var listItem = new dojox.mobile.ListItem({
label: response.myObject[i].name,
rightText: response.myObject[i].value,
clickable: true,
onClick: function() {
customFunction(response.myObject[i]);
this.transitionTo("someScreen");
}
});
myList.addChild(listItem);
}
},
error:function(e){alert(e);}
});
}
doSomething(myVal1, myVal2);
表示customFunction(response.myObject[i]);
的行总是返回myObject arrray中的最后一个对象。
有人能帮我学习语法吗?这样我就可以正确地使用它了?我一直在读关于js闭包和回调的文章,但我就是无法让它发挥作用。
感谢
您需要一个额外的包装器函数
onClick: (function(obj) {
return function() {
customFunction(obj);
this.transitionTo("someScreen");
};
})(response.myObject[i])
请参阅此答案以获得解释:
JavaScript的作用域是函数级,而不是块级,并且创建闭包只是意味着封闭作用域被添加到封闭功能的词汇环境。
循环终止后,函数级变量
i
具有值5
[注意:或者,在这种情况下,是response.myObject
]中最后一个属性的名称,这就是内部函数"看到的"。
您需要确保在for循环的每次迭代中,i
都包含在闭包中:
[...]
load: function(response){
for(var i in response.myObject) {
var listItem = new dojox.mobile.ListItem({
label: response.myObject[i].name,
rightText: response.myObject[i].value,
clickable: true,
onClick: (function(inner) {
return function (clickEvent) {
customFunction(response.myObject[inner]);
this.transitionTo("someScreen");
}
}(i))
});
myList.addChild(listItem);
}
}
[...]
相关文章:
- javascript,将参数传递给函数内部的闭包中的回调
- JavaScript闭包&回调函数
- 使用闭包/函数绑定将自函数作为回调传递
- 使用JavaScript回调函数了解变量作用域和闭包
- 带有 Javascript 回调的闭包
- 非常基本的JavaScript回调/闭包结构
- 闭包的意外行为:回调保存最后一个值
- 尝试使用带有参数的闭包作为回调
- 对闭包变量的更改是否在使用闭包的回调中可见
- 创建带有回调的动态 JSON 数组(内部闭包问题)
- JSONP 回调和闭包/范围
- Is回调函数始终是一个闭包
- Javascript闭包:Phonegap和'这'在回调中
- 参数对应关系:回调与闭包(?)
- 回调中的闭包
- 我需要在DOM事件回调中使用闭包吗
- 使用Google闭包编译器记录回调参数
- 访问子元素内的父作用域's onclick回调(Atom包)
- 维护对“this”的引用在Javascript中使用回调和闭包时
- javascript回调闭包未定义变量