在Javascript中需要帮助理解(词法)变量范围

bac*_*ser 3 javascript scope lexical

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

var ctry = "America";

function outer(msg) {
    console.log(msg + " " + ctry) ;
    var ctry = "Canada" ;
}
outer("God Bless");
Run Code Online (Sandbox Code Playgroud)

当我运行这个文件时,我希望看到"上帝保佑美国"但相反,我看到"上帝保佑未定义".

如果我注释掉内部var ctry = line,我会得到"God Bless America",如果我将内部var ctry =行移到console.log之上,我会得到"God Bless Canada".最后两个案例似乎是合乎逻辑的,但为什么在console.log之后var ctry的定义导致ctry在上面的代码中被设置为underfined?

Gre*_*ill 5

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

function outer(msg) {
    var ctry ;
    console.log(msg + " " + ctry) ;
    ctry = "Canada" ;
}
Run Code Online (Sandbox Code Playgroud)

现在应该清楚为什么你进入undefined输出.