我对JS和jQuery的理解非常有限,我来自C#背景。但我确实知道变量捕获是什么,我知道如果我在循环中捕获一个声明为循环的OUTSIDE的变量,每次委托运行时我将得到捕获变量的最后一个值,而不是捕获的时间。 但是,这显然不是问题,但我仍然收到最后一个值:
for (var i = 0; i < dialogs.length; i++) {
var dialog_button = dialogs[i];
var ix_parts = $(dialog_button).attr("id").split("_");
var index_tag = ix_parts[1];
var dialog_panel = $(dialog_panel_selector.replace("$ix$", index_tag));
$(dialog_button).click(function (event) {
$(dialog_panel).dialog('open');
return false;
});
}
由于dialog_button是在循环范围内声明的,我希望我会在点击处理程序中收到正确的值。
JS做了哪些不同的事情?
答案 0 :(得分:5)
for
循环是的,它正在做一些与众不同的事情,以下证明了这一点(和this jsfiddle):
var tests = [1,2,3,4,5];
for (var i=0; i<tests.length; i++){
var test = tests[i];
};
alert(test);
以上内容将提醒tests
数组中的最后一个值,这正是5
。这是因为 for
循环不是闭包 - 其中定义的变量也可以在其外部访问。
jQuery.each()
作为可能的解决方案顺便说一句,jQuery有jQuery.each()
辅助函数,它可以帮助你遍历对象和数组,而不需要for
循环。在回调局部变量内部将保持(本地)。
所以,基本上,以下内容应该可以解决您的问题(但是未经测试,请先测试一下):
jQuery.each(dialogs, function(ind, dialog){
var dialog_button = $(dialog);
var index_tag = dialog_button.attr("id").split("_")[1];
var dialog_panel = $(dialog_panel_selector.replace("$ix$", index_tag));
dialog_button.click(function(event){
event.preventDefault();
dialog_panel.dialog('open');
});
});
有帮助吗?你有什么问题吗?