0

我在一个模块中有这段代码:

    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 闭包内循环——简单的实际示例,但无法正确处理。

出于某种原因,上面的回调函数总是获取最新的 when 值。

在此先感谢愿意提供帮助的人!

PS:我猜这是因为每次都设置回调,因此每次都设置了最新的 when 值。但我不确定。

更新:这是一个尝试一下的修补程序......而且它有效!哦http://tinker.io/dee10(这段代码在本地反映了我的代码的当前状态。反正和上面一样)。

4

1 回答 1

2

正如您发布的问题的已接受答案中所述,JS 中没有块范围,只有函数范围。您的尝试不起作用,因为您只在“createCallback”函数中返回了一个新函数。每次调用“执行”函数时,您都需要返回一个新函数。

更新 嘿马可,看到你的评论。我无法运行您发送的修补程序,但我将代码复制/粘贴到 jsfiddle 中,它工作正常。在这里试试:http: //jsfiddle.net/tKkCh/

您可以看到该函数以每次传入的正确值“when”返回。这就是你想要的,对吧?至少在小提琴中,当你调用factory(i)()小提琴中的代码时,b/c js 是一种单线程语言。

也许您可以尝试包含更多其他代码来帮助我们弄清楚发生了什么......您试图让它在“asyncObj”中异步运行的方式可能存在问题。谢谢,祝你好运。

于 2013-08-12T04:37:52.643 回答