我知道这可能是"双贴"。但我无法为我的问题分配解决方案。
我有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!');
});
});
}
}
答案 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对象的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 ^。^