我有以下代码:
class Car() {
constructor() {
// ...
}
withSemi() {
// ...
}; // ESLint does not complain here
withoutSemi() {
// ...
} // ESLint does not complain here
}; // ESLint will complain about this semicolon (no-extra-semi)
有人可以解释自动分号插入在ES6中如何处理类以及ESLint为什么会出现这种行为?
答案 0 :(得分:2)
根据ECMAScript 2015 class
specification,分号是有效的ClassElement
,因此它可以存在于ClassBody
内。
但是,它的语义将其视为没有任何行为(例如,请参阅NonConstructorMethodDefinitions
)。 实际上,您可以在ClassBody
中添加所需数量的分号,但它不会改变任何内容。
自动分号插入实际上并没有在这里发挥作用,或者像人们通常认为的那样频繁。粗略地说,只有当解析器看到不允许成为前一个块或行的一部分时才会发生ASI。 (如果您感兴趣,ASI的actual rules并不长;向下滚动以获取示例和实用建议。)但是在这种情况下,您可以放一堆课程方法定义顺序一起。因此没有什么"意想不到的"关于列表中的下一个方法,因此不会在它们之间插入分号。
我不知道决定的历史,但我认为分号是有效的ClassElement
,因为它们已经作为空语句有效,如果你它可能会让人感到困惑不能将分号放在一个类体中。