【问题标题】:Why does 'class' have to be a reserved keyword in JavaScript?为什么 'class' 必须是 JavaScript 中的保留关键字?
【发布时间】:2018-09-01 11:34:21
【问题描述】:

几年前已经有人问过一个非常相似的问题 - why is class a reserved word in JavaScript?。答案是,这样您就可以添加我们现在拥有的 class 关键字。

但我想把这个问题更进一步。为什么有一个class 关键字会禁止使用class 作为标识符? JS 语法中是否有任何内容会使其模棱两可?还是说JS可以用某种解析器来解析?我不认为这样的事情是不可能的(虽然当然很傻):

class class {
    // ...
}

let x = new class();

请不要回答“因为规范是这样说的”或“根据定义,关键字被禁止作为标识符”。为什么规范必须是这种方式?或者这是一个武断或审美的决定?

这个问题并非完全是无谓的好奇。例如,class 是一个被禁止的标识符这一事实出现在 React 是否应该在 JSX 中使用 classclassName 的辩论中。

【问题讨论】:

  • 因为它是常见的保留关键字?因为它保持语义?因为无论如何你需要以某种方式命名它并且类是最好的名字? IDK。
  • 是的,但为什么我不能写let class="bourgeoisie";?我理解您为什么要禁止重新定义 truenull,但是是否存在需要 JS 语言设计来禁止名为 class 的变量的解析器歧义?
  • 如果你允许的话,考虑一下源代码的可读性。也许您很容易理解发生了什么,因为您编写了它并且确切地知道为什么将它用作标识符。但是对于阅读过您的代码的其他人,他们现在必须开始跟踪这个具有另一种语义的令人困惑的标识符。一个很好的练习可能是采用一个适当大小的函数,并用这个假设的类标识符替换 1 个主要变量,然后将其提供给您的同事阅读。看看他们无价的反应:)
  • 当然,我同意,这可能会令人困惑。我只是好奇是否有必要在语法上禁止这样做(因为它会使解析器/语法高亮显示更难或不可能编写),或者是否关注“仅”人体工程学。
  • asyncawaityield,它们在草率模式下没有关键字,可以用作标识符。语法(和解析器)要困难得多。

标签: javascript language-design


【解决方案1】:

如果类可以用作这样的标识符:

 class class 
 { // a class is followed by the classes body
   constructor() { /*...*/ }
 }

 const el = new class
 { // if class is not reserved, this is just a regular block
   alert("test");
 }

那么new class部分无法与类表达式区分开来:

 const el = new class
 {
   // block or class body?!
   constructor() { /*???*/ }
 }

【讨论】:

  • 但是一个后面是分号,另一个是大括号,所以我们可以区分它们吗?
  • @bergi 如果我们这样争论,var 也不必是保留关键字...var var = 1; 但是var = 1 不会是语法错误,没有人可以编写正确的 js因为它会一直失败而没有适当的错误。
  • @bergi 实际上,如果我们混合使用 block 语句,我们会得到完全相同的代码。
  • 是的,var 不一定是保留关键字——事实上,let 不在严格模式之外,所以我们可以写像var let = 1; let = 2; 这样的东西。但确实,正确的错误消息是使它们成为关键字的一个很好的理由
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2015-11-06
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多