【问题标题】:ReferenceError is not throwing when accessing 'let' variable before declaration在声明之前访问“let”变量时不会抛出 ReferenceError
【发布时间】:2016-03-17 05:34:09
【问题描述】:

我曾尝试在 Firefox V30.0 Scratchpad 中执行以下代码:

function do_something() {
  console.log(foo); // ReferenceError
  let foo = 2;
}
do_something();

预期的行为是我的程序应该抛出引用错误,因为我在声明之前访问了let 变量。但是,我没有得到预期的行为,程序被执行,结果如下

undefined

你能解释一下,它为什么会这样吗?

【问题讨论】:

  • 据我所知,let 声明的变量仍然被提升,与 var 相同,只是在它们的块顶部,而不是函数。
  • @JamesThorpe - 声明被提升,但由于临时死区,在初始化之前引用它们的任何尝试都应该抛出。
  • 你能不能在“严格模式”下运行代码,看看是否有什么变化,在我看来,预期的结果是抛出......变量提升只有在你使用 var 关键字时才会发生......
  • @JamesAllardice 嗯,很有趣。有人想知道为什么它们会被吊起来。这是否意味着它是 Firefox 实现中的一个错误?
  • 版本问题? caniuse.com/#search=let

标签: javascript ecmascript-6 let firefox-developer-tools


【解决方案1】:

根据MDN compatibility table,Firefox 仅从 v35 起才支持时间死区语义。

此外,您应该始终确保使用严格模式。由于担心破坏遗留网络,一些 ES6 功能在草率模式下不可用。尽管 Firefox 已经有很长的 let 使用历史,但它不应该影响这个特定案例。

【讨论】:

    【解决方案2】:

    让 ES6 中的变量被提升到声明它们的块的顶部。在声明之前引用变量将导致 ReferenceError (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let)。因此,您认为在这种情况下会发生 ReferenceError 是正确的。

    在这种情况下没有发生 ReferenceError 的原因是 FF 30 不支持所谓的“临时死区”。了解浏览器是否支持 ES6 规范的特定部分的好地方是 Kangax 的 Ecmascripts 兼容性表 (https://kangax.github.io/compat-table/es6/#test-let)。

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 2022-08-19
      • 2021-01-15
      • 2011-04-11
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2021-07-02
      相关资源
      最近更新 更多