JavaScript变量范围返回"undefined"

Cin*_*ndy 3 javascript variables scope

JavaScript指南中有一个关于变量范围的句子:"JavaScript中的变量在某种意义上"被提升"或被提升到函数或语句的顶部.但是,未初始化的变量将返回未定义的值."

   /**
    * Example 2
    */
   // will return a value of undefined
   var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么"console.log(myvar);"将返回undefined?我认为第一行已经将myvar初始化为"我的价值".

jfr*_*d00 5

因为所有变量声明都自动提升到其定义功能块的顶部,所以此代码:

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)

实际上这是JS解释器:

(function() {
  var myvar;   // declares a new local variable that covers up the global name
  console.log(myvar); // undefined
  myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)

哪个应该显示为什么本地定义的myvar是什么console.log()输出和它已被定义,但尚未初始化,因此它显示为undefined.

本地定义的myvar覆盖/覆盖全局定义的覆盖,因此当您myvar在函数中访问时,您只获取本地定义的变量(无论它是否已初始化).

查看有关同一主题的其他参考资料:

JavaScript变量如何工作?

JavaScript变量未定义与未定义

JavaScript中的每个函数一个var?

JavaScript'吊装'


如果你删除var你的函数(所以你只是引用一个变量,而不是声明一个新变量),那么你只会有一个名为的全局变量myvar,你会得到它看起来像你可能期望的行为:

var myvar = "my value";

(function() {
  console.log(myvar); // outputs "my value"
  myvar = "local value";
})();
Run Code Online (Sandbox Code Playgroud)