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