Javascript 影响循环中闭合函数中变量的闭包
我看不出这里出了什么问题。我删除了所有复杂的版本,加入了最简单的版本,它根本不想工作。第一个Javascript 影响循环中闭合函数中变量的闭包,javascript,loops,for-loop,closures,Javascript,Loops,For Loop,Closures,我看不出这里出了什么问题。我删除了所有复杂的版本,加入了最简单的版本,它根本不想工作。第一个console.log正确地输出所有正确的名称,但它的行为就像循环一次发生一样,然后对内部console.log再次执行该操作 有人能看到出了什么问题吗?在那个街区 console.log(that.config._events[i]);//未定义 i在每次调用闭包时都会变成-1 为了围绕i this.config = { source: psource, _events: [
console.log
正确地输出所有正确的名称,但它的行为就像循环一次发生一样,然后对内部console.log
再次执行该操作
有人能看到出了什么问题吗?在那个街区
console.log(that.config._events[i]);//未定义
i
在每次调用闭包时都会变成-1
为了围绕i
this.config = {
source: psource,
_events: [
'value1',
'value2',
'value3'
]
};
// Add callbacks to source
var that = this;
for (var i = this.config._events.length - 1; i >= 0; i--) {
var name = this.config._events[i];
console.log(name); // correct
$(this.config.source).on(name, function() {
console.log(name); // value1
console.log(that.config._events[i]); // undefined
});
}
在Javascript中,不建议在
for
循环中定义函数
相反,您应该使用一个javascript库来提供每个
,例如下划线
。那么您的代码将如下所示:
$(this.config.source).on(name, function(i) { return function() {
console.log(name); // value1
console.log(that.config._events[i]); // undefined
};
}(i) );
您可能希望在之前反转数组
这是你的电话号码
您还可以使用jQuery的
$。每个
都提供了类似的接口。语句“闭包影响一切,而不仅仅是这个”并没有描述问题-闭包就是这样工作的。封闭范围内的所有变量都包含在闭包中。请用更具描述性的内容修改问题的标题。我认为您应该提到术语for loop
duplicate with before,将I
作为参数传递给.on
方法,并使用event.I
访问变量。有关我的建议的更多详细信息,请参阅.on()
:@RobW的文档。由于我是一个数字原语,因此在这种情况下,这可能会起作用。但是,我特意选择了此解决方案,以便op能够理解,在闭包中保留对变量的引用并不等于在创建闭包时保留对变量当前值的引用。-1在for
循环中定义函数是完全安全的。你只需要知道变量的作用域和闭包是如何工作的。我将不安全
替换为危险
。这导致了很多混乱。实际上,jslint
不允许这样做。请投赞成票,这也没什么危险。它正常工作。我支持我的-1。jslint
不允许这是他们的选择,而不是javascript问题。
_.each(this.config._events, function(e) {
$(this.config.source).on(name, function() {
console.log(e);
});