Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 影响循环中闭合函数中变量的闭包_Javascript_Loops_For Loop_Closures - Fatal编程技术网

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