0

所以我的基本设置是这样的:

for (var i = 0; i < 3; i++) {
    var indices = [-1, -1, -1];
    while (index == -1) {
        // Do Stuff
        index[i] = newIndex;  
    }       
    var press = function() { alert(i); };
    new control({press: press});                
}

现在,当我按下每个新控件而不是得到 alert(0)、alert(1) 和 alert(2) 时,我得到了 alert(3)、alert(3) 和 alert(3)。我可以理解发生了什么。现在我的问题是:如何按照我的意图将不同的索引传递给函数?

4

2 回答 2

3

这是因为闭包变量i,解决方案是为每个循环创建一个私有闭包。

for (var i = 0; i < 3; i++) {
    var indices = [-1, -1, -1];
    while (index == -1) {
        // Do Stuff
        index[i] = newIndex;  
    }       
    var press = (function(myvar){
        return function() { alert(myvar); };
    })(i);
    new control({press: press});                
}
于 2013-06-12T09:34:55.100 回答
1

使用闭包:

var press = (function (x) {
    return function () {
        alert(x);
    };
})(i);

通过这种方式,当前i值被保存在一个安全的地方,一个私有函数。

请注意,var在循环内声明变量(带)不是标准的,您应该press在循环外声明变量。

于 2013-06-12T09:35:46.470 回答