3

我有一个使用 NodeJS 执行的 .js 文件。这是我的文件的内容:

var ctry = "America";

function outer(msg) {
    console.log(msg + " " + ctry) ;
    var ctry = "Canada" ;
}
outer("God Bless");

当我运行这个文件时,我希望看到“God Bless America”,但相反,我看到了“God Bless undefined”。

如果我注释掉内部 var ctry = 行,我得到“上帝保佑美国”,如果我将内部 var ctry = 行移到 console.log 上方,我得到“上帝保佑加拿大”。最后两种情况看起来合乎逻辑,但为什么在 console.log 之后的 var ctry 的定义会导致 ctry 在上面的代码中被设置为 underfined?

4

2 回答 2

5

局部变量的范围(ctry在您的情况下)是声明它的整个函数(也就是说,就好像变量是在函数顶部声明的)。您上面的代码在语义上与:

function outer(msg) {
    var ctry ;
    console.log(msg + " " + ctry) ;
    ctry = "Canada" ;
}

现在应该清楚为什么要进入undefined输出。

于 2012-07-17T22:14:53.070 回答
2

当你说var ctry在函数内部时(只要它在函数内部,在哪里都没有关系),那么发生的情况是ctry在函数内部进行的任何调用(同样,在哪里都无关紧要)将引用内部变量,而不是全球的。问题是,JS 解释器只看到一个变量的定义,但在执行该行之前不会用值(加拿大)初始化它,所以console.log它还没有定义。

于 2012-07-17T22:17:11.227 回答