2012-04-09 82 views
0

我有一个问题,当我做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 

我感到困惑。我认为应该输出↓,因为局部变量是由富变(2)

1 start 
2 start 
2 
2 

难道你们,请告诉我为什么/如何node.js的保持局部变量的内部回调函数访问? 非常感谢!

+0

您正在寻找的概念是[闭包](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)。 – geekosaur 2012-04-09 12:19:14

回答

4

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

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

由于您将外部函数调用两次,因此您有两个a s。每次通话一个。你有两个匿名函数,每个调用一个。每个匿名函数都在与a之一相同的范围内创建。

+1

“在其中声明一个函数可延长生命期以覆盖该函数。” 你说得很清楚,非常感谢! – Rocky 2012-04-09 12:28:01

1

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

+0

谢谢你的回答!明白了,我是JavaScript的新来者:) – Rocky 2012-04-09 12:31:04

1

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

或者你可以在谷歌搜索'javascript范围',你会发现很多的参考。

+0

谢谢你的回答!得到它了 – Rocky 2012-04-09 12:30:30

相关问题