簡體   English   中英

在JavaScript中進行對象文字賦值后是否需要分號?

[英]Are semicolons needed after an object literal assignment in JavaScript?

以下代碼說明了分配的對象文字,但之后沒有分號:

var literal = {
    say: function(msg) { alert(msg); }
}
literal.say("hello world!");

這似乎是合法的,並且不會發出警告(至少在Firefox 3中)。 這是完全合法的,還是有嚴格的JavaScript版本,這是不允許的?

我特別想知道未來的兼容性問題...我想寫“正確的”JavaScript,所以如果技術上我需要使用分號,我想使用它。

從技術上講,JavaScript在許多情況下都有分號作為可選項。

但是,作為一般規則,在任何聲明的最后使用它們。 為什么? 因為如果您想要壓縮腳本,它將為您節省無數個小時的挫敗感。

自動分號插入由解釋器執行,因此如果您願意, 可以將它們留出。 在評論中,有人聲稱

分號對於break / continue / throw等語句不是可選的

但這是不正確的。 它們是可選的; 真正發生的是線路終結器影響自動分號插入; 這是一個微妙的差異。

這是分號插入標准的其余部分:

然而,為方便起見,在某些情況下可以從源文本中省略這樣的分號。 這些情況通過說在這些情況下分號自動插入源代碼令牌流來描述。

YUI Compressor和dojo shrinksafe在沒有分號的情況下應該可以正常工作,因為它們基於完整的JavaScript解析器。 但Packer和JSMin不會。

在語句結束時始終使用分號的另一個原因是,偶爾您可能會意外地將兩個語句組合在一起以創建非常不同的語句。 例如,如果您使用通用技術跟隨語句來使用閉包創建范圍:

var literal = {
    say: function(msg) { alert(msg); }
}
(function() {
    // ....
})();

解析器可能會將括號解釋為函數調用,這會導致類型錯誤,但在其他情況下,它可能會導致一個難以跟蹤的細微錯誤。 另一個有趣的事故是如果下一個語句以正則表達式開頭,解析器可能會認為第一個正斜杠是一個除法符號。

JavaScript解釋器執行稱為“分號插入”的操作,因此如果沒有分號的行有效,則會在語句末尾靜靜地添加分號,並且不會發生錯誤。

var foo = 'bar'
// Valid, foo now contains 'bar'
var bas =
    { prop: 'yay!' }
// Valid, bas now contains object with property 'prop' containing 'yay!'
var zeb =
switch (zeb) {
  ...
// Invalid, because the lines following 'var zeb =' aren't an assignable value

不太復雜,至少在某些事情顯然不正確時會拋出錯誤。 但是有些情況下不會拋出錯誤,但由於分號插入,語句不會按預期執行。 考慮一個應該返回一個對象的函數:

return {
    prop: 'yay!'
}
// The object literal gets returned as expected and all is well
return
{
    prop: 'nay!'
}
// Oops! return by itself is a perfectly valid statement, so a semicolon
// is inserted and undefined is unexpectedly returned, rather than the object
// literal. Note that no error occurred.

像這樣的錯誤可能令人抓狂,而且你無法確保這種情況永遠不會發生(因為我不知道如何關閉分號插入),當你明確表達你的意圖時,這些類型的錯誤更容易識別一直使用分號。 明確添加分號通常被認為是好的風格。

在閱讀Douglas Crockford精湛而簡潔的書“ JavaScript:The Good Parts ”時,我第一次意識到這種陰險的可能性。 強烈推薦它。

在這種情況下,語句末尾不需要分號。 結論是一樣的,但推理是遠離的。

JavaScript沒有分號作為“可選”。 相反,它有關於自動分號插入的嚴格規則。 分號對於breakcontinuethrow等語句不是可選的。 有關更多詳細信息,請參閱ECMA語言規范 ; 特別是11.9.1,自動分號插入規則

使用JSLint保持JavaScript干凈整潔

JSLint說:

錯誤:

隱含的全球:警報2

第3行問題2:缺少分號。

}

沒有必要使用分號。 有些人選擇遵循總是用分號終止的慣例,而不是允許JavaScript在換行時自動執行,但我相信你會找到提倡任意一個方向的團體。

如果您正在編寫“正確”的JavaScript,我建議您使用javascript.options.strict (通過about:config訪問)設置為true來測試Firefox中的about:config 它可能無法捕獲所有內容,但它應該可以幫助您確保JavaScript代碼更加合規。

這是無效的(請參閱下面的說明)JavaScript代碼,因為賦值只是一個常規語句,沒有區別

var foo = "bar";

由於JavaScript解釋器嘗試添加分號來修復語法錯誤,因此可以省略分號,但這是一個額外且不必要的步驟。 我不知道任何嚴格的模式,但我知道自動解析器或壓縮器/混淆器需要分號。

如果你想編寫正確的JavaScript代碼,請寫分號:-)

根據ECMAscript規范, http://www.ecma-international.org/publications/standards/Ecma-262.htm ,如果缺少分號,則會自動插入分號。 這使得腳本作者不需要它們,但這意味着它們是解釋器所必需的。 這意味着原始問題的答案是“否”,在編寫腳本時不需要它們,但是,正如其他人所指出的,建議出於各種原因。

暫無
暫無

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

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