我很难适应 Node 的单线程 + 异步特性,再加上 javascript 的函数闭包。
假设我有这样的东西:
function foo(bar) {
someAsyncFunction(function callback(err) {
// do stuff with 'bar'
});
}
如果我遗漏了什么,请告诉我;但我的理解是:
- 由于闭包,
callback
将有一个 reference 到bar
但是,如果
foo
被调用一次且bar
= 20,则再次调用bar = 42
beforecallback
从第一次调用开始调用,然后bar
在callback 中会是 42
由第一次调用foo
产生。在 换句话说:foo(20)
#1someAsyncFunction(function callback() {})
#1foo(42)
#2someAsyncFunction(function callback() {})
#2callback()
#1 --------> 使用bar
=42callback()
#2 --------> 使用bar
=42
我说的对吗? (bar
是原始类型还是对象有关系吗?)。如果是这样,我该怎么做才能确保 callback
使用 bar
的正确值(除了传递 bar
一直向下和向上调用堆栈)?感谢您的帮助。
最佳答案
这是不正确的。每次调用 foo
都会创建一个新的 bar
,因此每个回调函数都可以访问不同的 bar
。
如果您希望只有一个 bar
,请在 foo
之外声明它,以便 foo
的每次调用共享相同的 条形图
:
var bar;
function foo(arg) {
bar = arg;
someAsyncFunction(function callback(err) {
// do stuff with 'bar'
});
}
这里,foo
没有声明一个新的 bar
变量,而是设置在更高范围内声明的 bar
的值。
关于javascript - Node.js:异步代码 + js 闭包的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985052/