可变变量可以从jQuery中的闭包访问
Mutable variable is accessible from closure in jQuery
我知道这可能是"双发"。但是我无法为我的问题分配解决方案。
我有 6 个文件上传输入字段。每当它们发生变化时,我都想提醒"已更改!我想用一个 for 循环遍历 6 个文件上传 id。现在,它给了我变量 i 的错误"可变变量可以从闭包访问"。我看到了一些解决方案。但是我无法将这些解决方案用于我的问题。
function fileUploadCheck() {
for (var i = 1; i <= 6; i++) {
$("document").ready(function () {
$("#SOMEID"+i).change(function () {
alert('changed!');
});
});
}
}
jQuery使用隐式迭代。您不必手动循环。
$("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" );
关于您的"可变变量可以从闭包访问",请参阅此简化示例
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 如果你对快捷方式感兴趣 ^.^
相关文章:
- 子类访问父类's闭包变量
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- 如何访问闭包中的变量
- 为什么nodejs's require在此闭包中无法使用调试器控制台访问?可能的v8优化
- 是否可以访问函数的闭包
- 为什么允许通过原型继承访问另一个闭包范围内的私有变量
- JQuery 访问单击的元素而不使用闭包
- 从 JavaScript 闭包中访问对象的值
- 如何从浏览器控制台访问存储在函数闭包中的 javascript 变量
- 如何在 javascript 中访问父函数闭包
- JavaScript闭包.循环访问当前i,j变量
- JavaScript:闭包是否可以通过值访问封闭范围中的变量,而不是像PHP中那样通过引用访问
- 使用闭包创建的私有函数如何访问构造函数中定义的变量
- 为什么我必须在闭包中声明一个函数来访问闭包中定义的变量
- Javascript:为什么对闭包变量的访问可能很慢
- JavaScript:是否可以访问私有变量(即隐藏在闭包中的变量)
- 从jQuery'访问外部方法;闭包'
- 可从闭包访问可变变量
- JS可变变量可从闭包访问
- 可变变量可以从jQuery中的闭包访问