簡體   English   中英

禁用或至少檢測自動分號插入

[英]Disable, or at least detect, automatic semicolon insertion

我總是以strict mode編寫代碼,希望屏蔽(或者至少強行告訴他更改我的代碼)來解決Javascript語言的問題,例如使用棄用的方法或錯誤解釋的語法。

但是我今天遇到了這個問題,我想知道是否有任何方法可以在瀏覽器中禁用分號插入,或者是否有類似於嚴格模式的'編譯'時錯誤?

JS [H / L] int似乎沒有能夠接受JS解釋器插入分號並標記它們以便我們減輕它的位置嗎?


編輯

如果在return關鍵字后面找到分號之前存在新行,則JShintJSLint都會出錯。 但是,我不知道有關自動插入的其他警告以及它們是否也被檢測到。
無論如何,如果答案實際上解決了“禁用”部分,那將更具相關性。

return關鍵字之后的表達式必須始終與關鍵字在同一行上開始,這與解釋器無關,它是由ECMAScript標准定義的,它是語言的一個不好的部分但是如果你尊重編寫JS代碼所描述的規則Douglas Crockford然后你再也不會遇到這個了。

來自Douglas Crockford的“JavaScript:The Good Parts”(附錄A.3可怕的部分):

JavaScript有一種機制,試圖通過自動插入分號來糾正錯誤的程序。 不要依賴於此。 它可以掩蓋更嚴重的錯誤。

它有時會在不受歡迎的地方插入分號。 考慮分號插入對return語句的影響。 如果return語句返回一個值,那么該值表達式必須與返回的同一行開始:

return
{
    status: true
};

這似乎返回包含狀態成員的對象。 不幸的是,分號插入將其轉換為返回undefined的語句。 沒有任何警告說分號插入導致了對程序的誤解。 如果{放在上一行的末尾而不是下一行的開頭,則可以避免此問題:

return {
    status: true
};

另請參閱Douglas Crockford的JavaScript代碼約定: http//javascript.crockford.com/code.html

我以為我會幫助遇到這個問題的人。
我已經開始使用Google的Closure Comiler來縮小JS的項目,它給了我一些方便的警告。

   $> java -jar google_closure_compiler.jar  --language_in=ECMASCRIPT5_STRICT --js_output_file 'min.js' 'file1.js' 'file2.js'
   file1.js:152: WARNING - unreachable code
               getSomething(function() { return this.doThingo(''); });
               ^

   file2.js:203: WARNING - Suspicious code. The result of the 'add' operator is not being used.
               ' to ' + (typeof obj);
               ^

   0 error(s), 2 warning(s)

有問題的代碼塊如下(注釋描述了編譯器提醒我的代碼丟失的內容):

file1.js:150

    return generateSomeObject(bunch, of, arguments)
        //the period before the function call was missing
        getSomething(function() { return this.doThingo(''); });
}

file2.js:201

if (someCondition)
    //trailing plus was missing from this line
    throw 'Could not set ' + last + ' of ' + (typeof root)
        ' to ' + (typeof obj);
return old;

我不知道它是否會識別瀏覽器整理的所有錯誤(所以我可能不會將此標記為答案),但它確實比YUI的縮小器為我做的更多(這忽略了所有這些例)。
此外,與YUI相比,編譯器能夠接收多個文件輸入,因此可以為每個文件提供錯誤的行號,並且不會出錯/重新生成debugger關鍵字)。
希望它也會對你有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM