[英]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沒有分號作為“可選”。 相反,它有關於自動分號插入的嚴格規則。 分號對於break
, continue
或throw
等語句不是可選的。 有關更多詳細信息,請參閱ECMA語言規范 ; 特別是11.9.1,自動分號插入規則 。
沒有必要使用分號。 有些人選擇遵循總是用分號終止的慣例,而不是允許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.