【问题标题】:Why "let" is not listed in the keywords of ECMAScript 2019 (ES10)?为什么 ECMAScript 2019 (ES10) 的关键字中没有列出“let”?
【发布时间】:2019-08-09 13:35:50
【问题描述】:

在 ECMAScript 2019 中,可以使用 let 声明一个新的(词法绑定)变量。 (规范第13.3.1节https://www.ecma-international.org/ecma-262/10.0/index.html#prod-LexicalDeclaration

为什么关键字列表中没有let (https://www.ecma-international.org/ecma-262/10.0/index.html#prod-Keyword 也在第 11.6.2.1 节)?

【问题讨论】:

  • 我不知道为什么。我的猜测是,它与“在评估 LexicalBinding 时,而不是在创建变量时,为由带有 Initializer 的 LexicalBinding 定义的变量分配其 Initializer 的 AssignmentExpression 的值有关。如果 let 声明中的 LexicalBinding 确实如此没有初始化器,当评估 LexicalBinding 时,变量被赋值为 undefined。"
  • 有“静态语义规则确保这种形式的 LexicalBinding 永远不会出现在 const 声明中。”这种差异可能与为什么选择将 let 排序为保留字而不是严格关键字有关。
  • 向后兼容性。 var let = 1 是有效的,因为它可能在旧代码中使用,而 let let = 1 会抛出 SyntaxError。
  • @str 你的解释是合理的。我猜const 在早期版本的 EcmaScript 中被定义为关键字,但没有分配给语义。所以const现在列在关键字列表中,并且也被主流浏览器实现了。

标签: javascript


【解决方案1】:

Javascript 保留字列表早在 2000 年就已在 3rd edition of the spec(第 14 页)中修复。为了向后兼容,无法扩展此列表,因为这会破坏现有程序。但是,规范作者无法预测当时该语言将如何发展,以及需要哪些新关键字。因此,一些“较新”的关键字不会被保留,除非使用严格模式。

var let = 1; // valid in the non-strict mode

从技术上讲,这意味着letawaityield 等对于编译器来说不是“标记”,而只是标识符,它们仅在特定的句法位置被赋予特殊含义,并按其他方式处理(再次,在非严格模式):

function *yield() { // identifier
    yield 1; // keyword
}

var let = 1; // identifier
let x = 2; // keyword    

严格模式同等对待“旧”和“新”保留字,尽管错误消息不同(“意外令牌”与“严格模式保留字”)。

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2014-04-14
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2018-08-02
    相关资源
    最近更新 更多