Javascript:变量的值在回调中使用之前发生了变化

时间:2013-08-12 04:13:19

标签: javascript variables asynchronous callback closures

我在模块中有这段代码:

    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(此代码在本地反映了我的代码的当前状态。无论如何,它与上面的内容相同)。

1 个答案:

答案 0 :(得分:2)

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

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

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

也许您可以尝试包含更多其他代码,以帮助我们弄清楚正在发生的事情......您可能会尝试让它在'asyncObj'中运行async。谢谢,祝你好运。