javascript - 全局 JavaScript 变量范围 : Why doesn't this work?

标签 javascript scope

所以我在研究 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/

相关文章:

javascript - JavaScript 中的 var 变量与 this 不同吗

javascript - overflow hidden 的CSS绝对位置动画

javascript - 将 Controller 与 Angular Scope 对象显式关联

javascript - JS : Assigning a variable in the parent scope of a closure costs performance. 为什么?

javascript - 从外部访问闭包内定义的 var(即定义闭包的范围)

javascript - 如何在客户端对字符串进行 ESlint?

javascript - 链接 .add 和 .submit 在 IE 中无法按预期工作

javascript - 两个重复的 ID 字段(_id 和 id)自动填充

c++ - 在函数参数列表中向前声明的类型如何在函数范围外可见?

python - 在 Python 中使 vars 在调用方法范围内可见的方法?