【发布时间】:2013-08-13 07:40:54
【问题描述】:
我在一个模块中有这段代码:
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 值执行,而不是在方法执行时设置的值(这是预期的行为)。
如您所见,我已经尝试过这个问题中描述的 hack:JavaScript closure inside loops – simple practical example,但无法做到。
由于某种原因,上面的回调函数总是获取最新的 when 值。
提前感谢愿意提供帮助的人!
PS:我猜这是因为每次都会设置回调,因此每次都设置了最新的 when 值。但我不确定。
更新:这是一个可以尝试的修补程序......而且它有效! o.ohttp://tinker.io/dee10(这段代码在本地反映了我代码的当前状态。反正和上面一样)。
【问题讨论】:
-
您的代码看起来不错。什么时候真的是一个数字?
-
是的,这很奇怪。你有一个显示失败的最小例子吗? (JSFiddle,还是什么?)
-
@bfavaretto 是的,什么时候是一个数字。 :D
-
@skishore 我会尽快创建一个小提琴。你看过PS吗?你认为这可能是原因吗?
-
正如我之前所说,您发布的代码很好。问题可能与您的 asyncObj 有关。例如,如果 getBuffer 将回调存储为 asyncObj 的属性,您将在每次调用时覆盖回调。
标签: javascript variables asynchronous callback closures