0

我在进行 node.js 异步编码时有一个问题。以下是示例代码:

function foo(arg) {
  var a = arg;
  console.log(a + ' start');
  setTimeout(function () {console.log(a);}, 500);
};
foo(1);
foo(2);

它输出:

1 start
2 start
1
2

我很困惑。我认为它应该输出↓,因为局部变量被 foo(2)

1 start
2 start
2
2

你们能告诉我为什么/如何 node.js 为内部回调函数访问保留局部变量吗?非常感谢!

4

3 回答 3

4

因为它是局部变量,而不是全局变量。这就是局部变量的意义所在。

var a创建一个在函数调用的生命周期内存在的变量。在其中声明一个函数会延长生命周期以覆盖该函数。当匿名函数被调用时,它会继续使用a存在于它创建的范围内的函数。

由于您两次调用外部函数,因此您有两个as。每个呼叫一个。您有两个匿名函数,每个调用一个。每个匿名函数都是在与其中一个 s 相同的范围内创建a的。

于 2012-04-09T12:18:28.077 回答
1

JavaScript 变量的范围是函数声明,而不是块。因此,您正在使用两个不同的变量。

于 2012-04-09T12:21:03.023 回答
1

它完全按照应有的方式工作。您a在函数中声明了变量,var a;并且您知道,声明了一个局部变量。的回调setTimeout与您的函数在同一范围内(您的 也是如此var a)。话虽这么说,这只是了解范围如何工作的问题。这是一篇关于它的古老而好的帖子:http ://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

或者你可以在谷歌上搜索“javascript scopes”,你会发现很多参考。

于 2012-04-09T12:21:25.480 回答