2013-02-22 58 views
-1

JavaScript中奇怪的“懒惰”行为。这个工作正常:JavaScript中涉及懒惰的一种奇怪行为

$(document).on("change", "#dropdown-menu-category-chk", function(){ 
    $("#dropdown-menu-category input[type='checkbox']").prop('checked', this.checked); 
}); 

$(document).on("change", "#dropdown-menu-category2-chk", function(){ 
    $("#dropdown-menu-category2 input[type='checkbox']").prop('checked', this.checked); 
}); 

$(document).on("change", "#dropdown-menu-category3-chk", function(){ 
    $("#dropdown-menu-category3 input[type='checkbox']").prop('checked', this.checked); 
}); 

// and so on.... 

但是在这段代码中变量i == 5!

function setDropDowns(){ 
    var idList = ['category', 'category2', 'category3', 'category4', 'category5'] 
    for(var i = 0; i < idList.length; i++){ 
    $(document).on("change", "#dropdown-menu-"+idList[i]+"-chk", function(){ 
     $("#dropdown-menu-" +idList[i] +" input[type='checkbox']").prop('checked', this.checked); 
     debugger; // i == 5; idList[i] === undefined 
    }); 
    } 
} 

即使我说

for(var i = 0; i < idList.length; i++){ 
    var id = dropDownCheckBoxItemList[i]; 
    $(document).on("change", "#dropdown-menu-"+id+"-chk", function(){ 

它不会工作,因为id将等于'category5'时的代码会被执行!

如何使用循环工作?我不想打破DRY的规则。

+0

顺便说一句,字符串'“#下拉菜单,菜单 - ” + ID +“-chk”'会立即得到评估,因此,这将实际上工作,虽然丑陋...但是,当然'ID'的价值会有同样的问题。 – 2013-02-22 07:41:03

回答

3

您需要在循环的每次迭代中捕获i的值。您可以通过引入新的范围与立即调用的函数表达式做到这一点:

for(var i = 0; i < idList.length; i++) { 
    (function (i) { 
     $(document).on("change", "#dropdown-menu-"+idList[i]+"-chk", function() { 
      // etc... 
     }); 
    }(i)); 
} 
+0

我该读什么声明?我知道它在想什么。这是一个匿名函数还是什么? – 2013-02-22 07:40:37

+0

@AlanDert - 是的,这是一个匿名函数,立即执行。你会经常听到这被称为封闭。这引入了一个新的范围,该范围在其创建时保持对外部词汇环境的引用。这意味着匿名函数在创建时总是可以访问'i'的状态。 – 2013-02-22 07:43:05

+0

为什么在我的情况下有懒惰的行为? – 2013-02-25 09:03:23