Javascript Node.js:异步代码出现问题+;js闭包

Javascript Node.js:异步代码出现问题+;js闭包,javascript,node.js,asynchronous,closures,Javascript,Node.js,Asynchronous,Closures,我很难适应节点的单线程+异步特性,再加上javascript的函数闭包 假设我有这样的东西: function foo(bar) { someAsyncFunction(function callback(err) { // do stuff with 'bar' }); } 如果我遗漏了什么,请告诉我;但我的理解是: 由于关闭,callback将引用bar 但是,如果使用bar=20调用一次foo,则再次使用 bar=42在从第一次调用调用回调之前,bar将

我很难适应节点的单线程+异步特性,再加上javascript的函数闭包

假设我有这样的东西:

function foo(bar) {
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}
如果我遗漏了什么,请告诉我;但我的理解是:

  • 由于关闭,
    callback
    将引用
    bar
  • 但是,如果使用
    bar
    =20调用一次
    foo
    ,则再次使用
    bar=42
    在从第一次调用调用
    回调之前,
    bar
    将在从
    foo
    的第一次调用产生的
    回调中为42。在里面
    换句话说:

  • foo(20)
    #1
  • someAsyncFunction(函数回调(){})
    #1
  • foo(42)
    2
  • someAsyncFunction(函数回调(){})
    #2
  • callback()
    #1------>使用
    bar
    =42
  • callback()
    #2------>使用
    bar
    =42

我说的对吗?(如果
bar
是原语还是对象,这有关系吗?)。如果是这样,我如何确保
callback
使用正确的
bar
值(除了在调用堆栈上下传递
bar
之外)?谢谢您的帮助。

否,
在执行第一个异步回调时,条形图仍然是20。对
foo
的每次调用都会获得自己的
bar
,它不受以后对
foo
的调用的影响。不,
bar
在执行第一次异步回调时仍然是20。对
foo
的每次调用都会得到自己的
,它不会受到以后对
foo
的调用的影响,而这些调用是不正确的。每次调用
foo
都会创建一个新的
,因此每个回调函数都可以访问不同的

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

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

这里,
foo
不声明新的
bar
变量,而是设置在更高范围内声明的
bar
的值。

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

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

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

在这里,
foo
并没有声明一个新的
bar
变量,而是设置在更高范围内声明的
bar
的值。

“每次调用foo都会创建一个新的bar”-这就是困扰我的问题。事实上,你发布的例子正是我所想的。谢谢你的回复每次调用foo都会创建一个新的条',这就是困扰我的地方。事实上,你发布的例子正是我所想的。谢谢你的回复!谢谢你的回复。的确,你是对的,但我决定接受另一个答案,因为他提供的例子让我更容易理解范围界定问题。谢谢你!谢谢你的回复。的确,你是对的,但我决定接受另一个答案,因为他提供的例子让我更容易理解范围界定问题。谢谢你!