0

我不完全确定如何表达这个问题,但基本上,我有一个类,button点击它应该调用传递给它的函数。

button = function(...,callBack) {
    //...
    this._cb = callBack;
}
button.prototype.callBack = function(e) {
    //...
    this._cb();
}

然后在别的地方

//on canvas click
e.target.callBack(e);

(我希望这是关于适量的背景,如果需要我可以提供更多)

所以我遇到的问题是当我动态实例化按钮时,它们的回调使用数组中的数据。IE

for (var i = 0; i < levels.length; i++) {
    buttons[buttons.length] = new button(..., function() {drawLevel(levels[i])});
}

然后,当它们被单击时,它们运行该回调代码并尝试为 i 找到一些随机值(可能是一个未使用的 for 循环var)并运行该级别。

我的问题是,我如何(不使用 eval)规避这个问题。

谢谢!

4

1 回答 1

2

我不是 100% 清楚你在问什么,但看起来你会在你在循环中创建的匿名函数中为 i 得到错误的值(它总是levels.length)

解决这个问题的方法是为每个创建的函数设置不同的范围,每个范围中的 i 都是循环中 i 的副本

buttons[buttons.length] = new button(..., (function(i){ 
    return function() {drawLevel(levels[i])};
})(i));
于 2013-09-22T18:24:35.817 回答