我在模块中有这段代码:
for (var i = 1; i <= n; i++) {
when = i * 1000;
track.execute(true, when); // <-- This line calls the method below
}
这篇文章在另一个模块中:
this.execute = function(on, when){
[...]
var createCallback = function(w){ // <-- Here 'when' should be bound to this function when is called below
return function(buffers){
object.doSomething(buffers, w);
}
};
[...] // None of this code modifies when or the callback 'factory'
this.asyncObj.getBuffer(createCallback(when)); // <-- Binding ?!?
};
问题是when
的值在每次调用时都会更新,因此回调总是以最新的when值执行,而不是在执行方法时设置的值(这是预期的行为)。
正如你所看到的,我已经尝试过这个问题中描述的黑客攻击:JavaScript closure inside loops – simple practical example但是无法做到正确。
由于某种原因,上面的回调函数总是得到when的最新值。
提前感谢任何想要帮助的人!
PS:我想这是因为每次都设置了回调,因此每次都设置了最新的when值。但我不确定。
更新:这是一个尝试它的修补程序......它的工作原理! O.o http://tinker.io/dee10(此代码在本地反映了我的代码的当前状态。无论如何,它与上面的内容相同)。
答案 0 :(得分:2)
正如您发布的问题的接受答案中所提到的,JS中没有块范围,只有函数范围。您的尝试不起作用,因为您只在“createCallback”函数中返回一个新函数。每次调用'execute'函数时都需要返回一个新的。
<强>更新强> 嘿Marco,看到了你的评论。我无法运行您发送的修补程序,但我将代码复制/粘贴到jsfiddle中并且工作正常。在这里试试:http://jsfiddle.net/tKkCh/
您可以看到函数返回的是每次传递的'when'的正确值。这就是你想要的,对吧?至少在小提琴中,当你调用factory(i)()
时,正在评估小提琴中的代码,b / c js是一种单线程语言。
也许您可以尝试包含更多其他代码,以帮助我们弄清楚正在发生的事情......您可能会尝试让它在'asyncObj'中运行async。谢谢,祝你好运。