Node.js:异步代码+ js闭包问题

时间:2013-11-14 18:05:56

标签: javascript node.js asynchronous closures

我无法适应Node的单线程+异步性质,再加上javascript的函数闭包。

假设我有类似的东西:

function foo(bar) {
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}

如果我遗失了什么,请告诉我。但我的理解是:

  • 由于关闭,callback将有一个引用bar
  • 但是,如果foo = 20,则调用bar,然后再调用bar = 42 在第一次调用中调用 callback之前bar callback在第一次调用foofoo(20)中将为someAsyncFunction(function callback() {}) 。在 换句话说:

    1. foo(42)#1
    2. someAsyncFunction(function callback() {})#1
    3. callback()#2
    4. bar#2
    5. callback()#1 ------->使用bar = 42
    6. bar#2 ------->使用callback = 42

我对此是否正确? (如果bar是原始的还是对象,这是否重要?)。如果是这样,我该怎么做才能确保bar使用{{1}}的正确值(ASIDE从{{1}}一直向下传递到调用堆栈)?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

不,当执行第一个异步回调时,bar仍为20。每次拨打foo都会获得自己的bar,这些foo未受{{1}}未来电话的影响。

答案 1 :(得分:2)

这是不正确的。每次调用foo都会创建一个新的bar,因此每个回调函数都可以访问不同的bar

如果您希望只有一个bar,请在foo之外声明它,以便foo的每次调用都共享bar

var bar;
function foo(arg) {
    bar = arg;
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}

此处,foo未声明新的bar变量,而是设置在更高范围内声明的bar值。