影响循环内闭合函数中变量的闭包
Closures affecting variables in a closed function within a loop
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
});
}
我看不出这里有什么问题。我删除了所有复杂的版本并放入了最简单的版本,它根本不想工作。第一个console.log
正确输出所有正确的名称,但它的行为就像循环同时发生一样,然后再次为内部console.log
执行。
谁能看出出了什么问题?
在该块中
console.log(that.config._events[i]); // undefined
每次调用闭包时,i
最终都会是 -1。
您必须执行此类操作才能在i
周围创建闭包
$(this.config.source).on(name, function(i) { return function() {
console.log(name); // value1
console.log(that.config._events[i]); // undefined
};
}(i) );
在 Javascript 中,不建议在 for
循环中定义函数。
相反,您应该使用提供each
的javascript库,例如 underscore
.然后你的代码将如下所示:
_.each(this.config._events, function(e) {
$(this.config.source).on(name, function() {
console.log(e);
});
您可能希望之前反转阵列。
这是 _.each 的文档
你也可以使用jQuery的$.each
,它提供了一个类似的接口。
相关文章:
- 子类访问父类's闭包变量
- 构造函数函数闭包变量
- 如何冻结函数's在闭包中的变量
- 使变量可用于不带闭包的异步调用
- 局部变量在闭包中丢失
- 其中是闭包中存储的变量-堆栈或堆
- javascript闭包:保护内部变量
- Javascript:附加字符串中的事件,闭包中的变量求值
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript闭包和变量引用
- 如果全局上下文中的变量是属性,那么为了闭包的目的,如何区分它们
- 如何访问闭包中的变量
- 闭包中的本地变量从外部更改.这是一个javascript错误,或者我做错了什么
- 使用JavaScript回调函数了解变量作用域和闭包
- 递增并存储一个“;私人的“;使用闭包的变量
- 循环和局部变量内部的闭包
- 未使用JS闭包将变量传递给onClick函数
- 函数变量闭包
- 陷入javascript变量闭包
- 用具体的例子理解Javascript中的私有变量(闭包?)