我无法适应Node的单线程+异步性质,再加上javascript的函数闭包。
假设我有类似的东西:
function foo(bar) {
someAsyncFunction(function callback(err) {
// do stuff with 'bar'
});
}
如果我遗失了什么,请告诉我。但我的理解是:
callback
将有一个引用到bar
但是,如果foo
= 20,则调用bar
,然后再调用bar = 42
在第一次调用中调用 callback
之前bar
,callback
在第一次调用foo
后foo(20)
中将为someAsyncFunction(function callback() {})
。在
换句话说:
foo(42)
#1 someAsyncFunction(function callback() {})
#1 callback()
#2 bar
#2 callback()
#1 ------->使用bar
= 42 bar
#2 ------->使用callback
= 42 我对此是否正确? (如果bar
是原始的还是对象,这是否重要?)。如果是这样,我该怎么做才能确保bar
使用{{1}}的正确值(ASIDE从{{1}}一直向下传递到调用堆栈)?谢谢你的帮助。
答案 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
值。