Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的一种奇怪行为,涉及懒惰_Javascript_Jquery - Fatal编程技术网

javascript中的一种奇怪行为,涉及懒惰

javascript中的一种奇怪行为,涉及懒惰,javascript,jquery,Javascript,Jquery,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", functi

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
    });
  }
}
函数设置下拉列表(){
var idList=['category','category2','category3','category4','category5']
对于(变量i=0;i
即使我说

for(var i = 0; i < idList.length; i++){
  var id = dropDownCheckBoxItemList[i];
  $(document).on("change", "#dropdown-menu-"+id+"-chk", function(){
for(变量i=0;i
它不会工作,因为执行代码时,
id
将等于
'category5'


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

您需要在循环的每次迭代中捕获
I
的值。您可以通过引入一个新的作用域并立即调用函数表达式来实现这一点:

for(var i = 0; i < idList.length; i++) {
    (function (i) {
        $(document).on("change", "#dropdown-menu-"+idList[i]+"-chk", function() {
            // etc...
        });
    }(i));
}
for(变量i=0;i
我读到这条语句是什么?我知道它是怎么想的。这是一个匿名函数还是什么?@AlanDert-是的,它是一个立即执行自身的匿名函数。你经常会听到这被称为闭包。这引入了一个新的作用域,它在cr时维护对外部词汇环境的引用eation。这意味着匿名函数在创建时始终可以访问
i
的状态。在我的情况下,为什么它会有惰性行为?原因很简单,当事件处理程序执行时,您的循环已经完成,所以
i
具有其最终值。顺便说一句,字符串
“#下拉菜单-“+id+”-chk”
将立即得到评估,因此这实际上是可行的,尽管很难看……但是
id
的值当然也会有同样的问题。