1

我无法适应 Node 的单线程 + 异步特性以及 javascript 的函数闭包。

假设我有类似的东西:

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

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

  • 由于关闭,callback会有参考bar
  • 但是,如果foobar= 20 调用一次,然后再 从第一次调用调用bar = 42 before ,那么第一次调用的结果将是 42 。换句话说:callbackbarcallbackfoo

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

我对此是否正确?(bar是原始的还是对象有关系吗?)。如果是这样,我该怎么做才能确保callback使用正确的值(除了一直向下和向上bar传递调用堆栈)?bar感谢您的任何帮助。

4

2 回答 2

2

不,bar执行第一个异步回调时仍为 20。每个调用foo都有自己的bar,不受未来调用的影响foo

于 2013-11-14T18:11:53.667 回答
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声明的值设置在更高的范围内。

于 2013-11-14T18:12:01.240 回答