可以从jQuery中的闭包访问可变变量

时间:2014-04-07 08:03:13

标签: javascript jquery

我知道这可能是"双贴"。但我无法为我的问题分配解决方案。

我有6个fileupload输入字段。每当他们改变时,我都要警惕"改变了!"。 我想通过for循环迭代6个fileupload id' s。 现在,它给出了变量i&#34的错误;可以从闭包中获取可变变量"。我看到了一些解决方案。但是我无法将这些解决方案用于我的问题。

function fileUploadCheck() {
    for (var i = 1; i <= 6; i++) {
        $("document").ready(function () {
            $("#SOMEID"+i).change(function () {
                alert('changed!');
            });
        });
    }
}

1 个答案:

答案 0 :(得分:3)

jQuery使用implicit iteration。您不必手动循环。

$("input[type=file]").change(function(event) {
  // check your console to see the value of `this`
  console.log(this, "changed");
});

来自jQuery .each docs

  

注意:大多数返回jQuery对象的jQuery方法也循环遍历jQuery集合中的元素集 - 一个称为隐式迭代的过程。发生这种情况时,通常不必使用.each()方法显式迭代:

// The .each() method is unnecessary here:
$( "li" ).each(function() {
  $( this ).addClass( "foo" );
});

// Instead, you should rely on implicit iteration:
$( "li" ).addClass( "bar" );

关于“可以从闭包中访问Mutable变量”,请参阅此简化示例

for (var i=1; i<=6; i++) {
  setTimeout(function() {
    console.log(i);
  }, 100);
}

// 777777
// ALL SEVENS? WTF

原因是,闭包取决于i,但i正在关闭之外。当任何函数运行时,i已设置为7,因此每个函数的记录输出为7

如果您使用我上面的方法,您根本不必担心这一点。如果您仍然好奇如何解决这个问题,请参阅

for (var i=1, fn; i<=6; i++) {

  fn = (function(n) {
    console.log(n);
  })(i);

  setTimeout(fn, 100);
}

// 123456
// YAY

现在每个函数都与一个不可变的i输入正确“绑定”;意味着i的值不会在封闭包装函数内部发生变化。如果您对快捷方式感兴趣,请查看Function.prototype.bind ^。^