node.js保持局部变量的功能,为什么?

时间:2012-04-09 12:15:45

标签: javascript node.js

当我执行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保留用于内部回调函数访问的局部变量? 非常感谢!

3 个答案:

答案 0 :(得分:4)

因为它是局部变量,而不是全局变量。这是局部变量的重点。

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

由于您调用外部函数两次,因此您有两个a。每个电话一个。您有两个匿名函数,每个函数一个。每个匿名函数都创建在与a s。

之一相同的范围内

答案 1 :(得分:1)

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

答案 2 :(得分:1)

它的工作原理应该如此。 您使用a在函数内声明了变量var a;,并且您知道如何声明局部变量。 setTimeout的回调与您的函数在同一范围内(您的var a也是如此)。 据说这只是了解范围如何运作的问题。 这是一篇关于它的古老而好的帖子:http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

或者你可以在google上搜索“javascript范围”,你会发现很多参考资料。