【问题标题】:Why is it that Javascript variables are created undefined even if they don't pass if statement?为什么即使未通过 if 语句,Javascript 变量也会被创建为未定义?
【发布时间】:2013-01-23 22:09:41
【问题描述】:

以这个为例。

if (b) b = 1;

参考错误。 b 未定义。有道理,但如果我这样做......

if (b) var b = 1;

我在控制台中未定义。现在当我查看 b 是什么时,它显示为未定义。

如果我再次尝试执行相同的 if 语句,它不会通过,因为 b 既不是真也不是假,它是未定义的,但我想我的问题是为什么它显示为未定义?无论 if 语句通过还是失败,Javascript 是否都会通过 if 语句?谢谢。

【问题讨论】:

  • var 被提升,所以b 在作用域的开头被初始化为undefined。把它想象成var b; if (b) b = 1;
  • Paul 所说的,vars 被提升了,显而易见的事情是声明你的变量之前你检查它们是否真实/虚假。
  • Puzzled by this JavaScript code snippet 的可能重复项(如果您理解这个问题/答案,那么您就会明白它为什么会这样工作)
  • stackoverflow.com/questions/13427311/… - 条件中var 的另一个示例。
  • @aug 这非常特定于语言,就像一般范围规则一样。 (JavaScript 作用域有点类似于 Python,但在 Python 中必须声明全局变量,而不是局部变量;JavaScript 作用域有点类似于 Ruby,但 Ruby 要求变量在使用前以左值的形式出现,并且不链接到“全局”作用域; JavaScript 作用域与 C/Java 不太相似,C/Java 中的每个块都引入了一个新的作用域,并且必须提前声明变量,等等 ..)

标签: javascript variables if-statement


【解决方案1】:

所有vars 都被提升到它们所在范围的开头,将它们的值初始化为undefined。然后在执行到达 var 最初所在的行时设置该值。

在您的第二个示例中,b 在遇到if 之前被初始化为undefined,这是由于var。把它想象成写下面的一样

var b;
if (b) b = 1;

执行此代码后,b 仍将是 undefined,因为它永远不会运行到 if 块,因为初始值为 falsy

正如pst 所提到的,这是 JavaScript 的特定语言特性,因此在用其他语言编写代码时不要期望相同的行为。

【讨论】:

【解决方案2】:

JS 不会通过 if 语句,而是读取语句的 if 部分,并且由于 b 没有在任何地方定义,而是在 if 语句中定义,因此您会得到 undefined

【讨论】:

  • 这并没有解决var的行为。
  • 我同意它没有解释将 var 放在变量前面如何改变全局化(提升?)的方式,但我认为 OP 是在询问 JS 是否通过 @ 987654327@ 声明,如果if 为假,我认为它不会这样做,不是吗?
猜你喜欢
  • 2013-09-17
  • 2021-08-11
  • 2020-08-31
  • 2017-03-21
  • 2018-06-25
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多