全局JavaScript变量范围:为什么这不起作用?

Cor*_*ing 10 javascript scope

所以我正在玩JavaScript并遇到了我认为奇怪的事情.有人能够解释以下内容吗?(我已将警报值包含在评论中)

为什么foo()内的第一个警报(msg)返回undefined而不是外部

var msg = 'outside';

function foo() {
  alert(msg); // undefined

  var msg = 'inside';
  alert(msg); // inside
}

foo();    
alert(msg); // outside
Run Code Online (Sandbox Code Playgroud)

考虑到这些都很好:

var msg = 'outside';

function foo() {
  alert(msg); // outside
}

alert(msg); // outside
Run Code Online (Sandbox Code Playgroud)

和:

var msg = 'outside';

function foo() {
  var msg = 'inside';
  alert(msg); // inside
}

alert(msg); // outside
Run Code Online (Sandbox Code Playgroud)

Sha*_*nau 17

你的第一个例子中发生的事情是msg的声明和初始化被拆分,声明被提升到闭包的顶部.

var msg; //declaration
msg = "inside" //initialization
Run Code Online (Sandbox Code Playgroud)

因此,您编写的代码与之相同

var msg = 'outside';

function foo() {
var msg;  
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
Run Code Online (Sandbox Code Playgroud)

第二个例子不一样.在第二个示例中,您尚未声明本地变量msg,因此alert(msg)引用全局消息.这里有一些进一步的阅读: 吊装

  • 为什么选择downvote?看起来Shaun是正确的. (4认同)