当我执行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保留用于内部回调函数访问的局部变量? 非常感谢!
答案 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范围”,你会发现很多参考资料。