【问题标题】:Hoisting and 'let' in JavaScriptJavaScript 中的提升和“让”
【发布时间】:2018-08-20 17:40:02
【问题描述】:

问题是:

为什么这不会引发引用错误:

console.log(a)
let a = 5;

但这会引发参考错误:

{
 console.log(a)
 let a = 5;
}

现在,如果我们使用“var”,那么在这两种情况下,代码都会运行并注销“未定义”,但有人可以解释一下“让”(和“常量”)发生了什么。

【问题讨论】:

  • 两者都抛出引用错误。
  • 我在 Node 和 Chrome 的控制台中尝试了第一个代码,都抛出了“ReferenceError”
  • 我无法重现您描述的行为。您确定在您显示的测试代码之前,您还没有在范围内定义 a 吗?
  • @mark 即使那样它也会抛出。
  • 注意你在写什么:你的两段代码是完全一样的。现在,你的问题是什么?

标签: javascript scope hoisting


【解决方案1】:

如 cmets 中所述,这两者都会引发引用错误。

console.log(a)
let a = 5;

{
 console.log(a)
 let a = 5;
}

但你是对的。如果您使用var,则undefined 会记录到控制台。

console.log(a)
var a = 5;

来自blog post on medium - 这不是我写的 - 你可以在这里阅读更多相关信息。

JavaScript 引擎将所有使用“var”的变量声明视为 如果它们被声明在功能范围的顶部(如果声明 在函数内部)或全局范围(如果在函数外部声明) 无论实际声明发生在哪里。这本质上是 “吊装”。

这仅适用于varletconst 会抛出引用错误并且有据可查(参见 ECMAScript 2015 specification)。这是因为尽管letconst 被提升了,但在代码执行初始化行之前它们不会被初始化。 letconst 被提升和初始化之间的时间通常称为临时死区

【讨论】:

  • 我赞成你的回答,这是完全正确的,虽然没用:问题本身表明基本不愿意参考可用的文档。
猜你喜欢
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2015-03-30
  • 2020-09-10
  • 2020-12-08
  • 2011-08-27
相关资源
最近更新 更多