我有一个用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?
答案 0 :(得分:5)
局部变量的范围(在您的情况下为ctry
)是声明它的函数的整个(就好像变量是在顶部声明的那样)的功能)。上面的代码在语义上与:
function outer(msg) {
var ctry ;
console.log(msg + " " + ctry) ;
ctry = "Canada" ;
}
现在应该清楚为什么在输出中得到undefined
。
答案 1 :(得分:2)
当你在函数内部说var ctry
时(只要它在函数内部并不重要),那么会发生在函数内部对ctry
的任何调用(同样,无论在哪里)都会引用内部变量,而不是全局变量。问题是,JS解释器只看到变量的定义,但是在它执行该行之前不会使用值(加拿大)对其进行初始化,因此在console.log
中它尚未定义。