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

时间:2012-07-17 22:12:47

标签: javascript scope lexical

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

var ctry = "America";

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

现在应该清楚为什么在输出中得到undefined

答案 1 :(得分:2)

当你在函数内部说var ctry时(只要它在函数内部并不重要),那么会发生在函数内部对ctry的任何调用(同样,无论在哪里)都会引用内部变量,而不是全局变量。问题是,JS解释器只看到变量的定义,但是在它执行该行之前不会使用值(加拿大)对其进行初始化,因此在console.log中它尚未定义。