所以我在研究 JavaScript 时遇到了我认为很奇怪的事情。任何人都可以解释以下内容吗? (我已将警报值作为注释包括在内)
为什么 foo() 中的第一个警报 (msg) 返回 undefined 而不是 outside?
var msg = 'outside';
function foo() {
alert(msg); // undefined
var msg = 'inside';
alert(msg); // inside
}
foo();
alert(msg); // outside
考虑到这些都很好:
var msg = 'outside';
function foo() {
alert(msg); // outside
}
alert(msg); // outside
和:
var msg = 'outside';
function foo() {
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
最佳答案
在您的第一个示例中发生的事情是 msg 的声明和初始化与被提升到闭包顶部的声明分开。
var msg; //declaration
msg = "inside" //initialization
因此您编写的代码与
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
第二个例子就不一样了。在您的第二个示例中,您没有声明局部变量 msg,因此 alert(msg) 指的是全局 msg。 以下是一些进一步的阅读: Hoisting
关于javascript - 全局 JavaScript 变量范围 : Why doesn't this work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2685388/