JavaScript变量范围返回" undefined"

时间:2014-10-10 02:49:12

标签: 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";
})();

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

2 个答案:

答案 0 :(得分:5)

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

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();

实际上是JS解释器:

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

这应该向您展示为什么本地定义的myvarconsole.log()输出的内容并且已经定义,但尚未初始化,因此它显示为undefined

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

请参阅有关同一主题的其他参考资料:

How do JavaScript variables work?

JavaScript variable undefined vs not defined

One var per function in JavaScript?

JavaScript 'hoisting'


如果删除函数中的var(因此您只是引用变量,而不是声明一个新变量),那么您将只有一个名为myvar的全局变量,并且您将得到看起来你可能期待的行为:

var myvar = "my value";

(function() {
  console.log(myvar); // outputs "my value"
  myvar = "local value";
})();

答案 1 :(得分:2)

这里你的函数是一个自调用函数。自动调用(启动)自调用表达式,而不调用。提升适用于变量声明和函数声明。

var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();

所以这里函数甚至在用指定值

初始化myvar之前就调用了它