Node.js:asynchronous代码+ jsclosures的麻烦

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

假设我有这样的东西:

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

请让我知道,如果我失去了一些东西; 但我的理解是:

  • 由于closures, callback会有一个参考 bar
  • 但是,如果在bar = 20时调用foo一次,那么在第一次调用callback 之前再次使用bar = 42 ,那么bar在第一次调用foo callback中将是42。 换一种说法:

    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 (ASIDE从传递bar一直向下和调用堆栈)? 感谢您的任何帮助。

这是不正确的。 每个foo调用都会创build一个新的bar ,所以每个callback函数都可以访问不同的bar

如果你想要只有一个bar ,在foo之外声明它,这样每个foo调用共享一个bar

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

在这里, foo不会声明一个新的barvariables,而是将bar的值设置在一个更高的范围内。

不, bar执行第一次asynchronouscallback时仍然是20。 每次调用foo都会获得自己的bar ,这个bar不会被未来的foo调用所影响。