循环中的jQuery变量捕获

时间:2011-11-20 10:10:11

标签: javascript jquery variables

我对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做了哪些不同的事情?

1 个答案:

答案 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');
    });
});

有帮助吗?你有什么问题吗?