影响循环内闭合函数中变量的闭包

时间:2012-03-15 18:16:18

标签: javascript loops for-loop closures

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执行。

有人能看出什么问题吗?

2 个答案:

答案 0 :(得分:2)

在那个区块中

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) );

答案 1 :(得分:-1)

在Javascript中,不建议在for循环中定义函数。

相反,您应该使用提供each的javascript库,例如underscore。然后你的代码将如下所示:

    _.each(this.config._events, function(e) {
       $(this.config.source).on(name, function() {
          console.log(e);
       });

您可能希望在之前反转数组。

以下是doc for _.each

你也可以使用提供类似界面的jQuery $.each