【问题标题】:JavaScript variable scope return "undefined" [duplicate]JavaScript变量范围返回“未定义”[重复]
【发布时间】:2014-12-05 03:17:21
【问题描述】:

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 初始化为“我的值”。

【问题讨论】:

  • 你的代码示例有两个同名的变量,一个是函数本地的,一个是被记录的。
  • 忘掉“提升”这个词吧,它会分散注意力。在执行任何代码之前处理变量和函数声明。 然而,初始化发生在执行过程中。因此,虽然变量从一开始就存在,但在赋值执行之前它不会被赋值。

标签: javascript variables scope


【解决方案1】:

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

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

【讨论】:

  • 请注意,OP 很困惑,因为她的示例有两个同名变量:问题明确提到了分配给全局变量的值。
  • @nnnnnn - 是的,我已经通过一些编辑解决了这个问题。
  • 在 ES5 中,variables are initialised to undefined when created,所以它们的值总是被定义并且它们本质上被“初始化”了两次。 ;-)
  • @RobG - 不是在所有版本的 javascript(不仅仅是 ES5)中,尚未由您自己的代码初始化的变量的值为 undefined
  • @jfriend00——是的,你是对的,我只是之前在 ed 3 中没见过它。 :-)
【解决方案2】:

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

var myvar = "my value";

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

所以这里的函数甚至在使用指定值初始化 myvar 之前就自行调用了它

【讨论】:

  • 全局变量在函数被调用之前被初始化。但是记录的未定义值属于同名的局部变量,并且局部变量的初始化不受函数调用方式的影响。涉及立即调用的函数表达式这一事实是无关紧要的。
猜你喜欢
  • 1970-01-01
  • 2014-11-09
  • 2012-01-16
  • 2010-12-07
  • 1970-01-01
  • 2018-01-28
  • 2019-05-03
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多