2015-06-15 36 views
2

我有以下代碼:ESLint錯誤6

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有這種行爲?

+3

根據我的理解,'class'的語義與'function'類似,沒有分號,即'class name {}'和'function name(){}',所以ESLint會對其警告是正確的。 – Xotic750

+0

那麼如何解釋方法後的分號呢? (ESLint不關心我是否添加它們)。 – adrianp

+2

從我所看到的'方法'沒有關鍵字'函數'而定義,就像'函數'不應該結束';'。但是像'public numAttacks = 0;'這樣的表達式應該以';'結尾;所以很像你希望javascript寫在ES6前 – Xotic750

回答

2

根據ECMAScript 2015 class specification,分號是有效的ClassElement,所以它可以存在於ClassBody內。

但是,其語義將其視爲沒有任何行爲(例如,請參閱NonConstructorMethodDefinitions)。 實際上,您可以在ClassBody中包含儘可能多或較少的分號,它不會改變任何事物。

實際上,自動分號插入在這裏不起作用,或者像人們一般認爲的那樣。粗略地說,ASI只發生在解析器看到不允許成爲上一個塊或行的一部分時發生。 (如果你感興趣,ASI的actual rules不是很長;向下滾動以獲取示例和實用建議。)但是在這種情況下,你可以順序地將一堆類方法定義在一起。因此,列表中的下一個方法沒有什麼「意外」,所以不會在它們之間插入分號。

我不知道決策的歷史,但我認爲分號是有效ClassElement因爲他們分別爲空語句已經有效,它很可能是混亂的人,如果你不能放分號一個班級的身體。

+0

你的回答很有道理,但通過查看ESLint [docs](http:// eslint.org/docs/rules/no-extra-semi)我本來期望它會抱怨班級內部的額外半決賽。 – adrianp

+0

其實,看[規則的來源](https://github.com/eslint/eslint/blob/master/lib/rules/no-extra-semi.js),它絕對應該在課堂上捕獲半決賽身體。你在你的配置中將ecmaVersion設置爲6或更高?否則ESLint不會使用'class'規則...... – tdhsmith