javascript的分號代表語句的結束符,但由於javascript具有分號自動插入規則,所以它是一個十分容易讓人模糊的東西,在一般情況下,一個換行就會產生一個分號,但實際情況卻不然,也就是說在javascript中換行可能產生分號,也可能不產生,是否自動插入分號,主要看上下行。所以即使是經驗豐富的程式設計師,有時候也會頭大。
在ECMAScript中對分號自動插入規則也有相應的解釋:空語句,變數語句,表達式語句,do-while 語句,continue 語句,break 語句,return 語句,以及throw 語句,這些確定的ECMAScript語句必須以分號結束。這些分號可以總是明確地出現在原始碼文字中。為方便起見,在特定的情況下,原始碼文字中的這些分號可以被省略。也就是說這些語句的結尾是不需要硬性的輸入分號結尾,javascript會自動插入語句結束處。
想了解詳細的ECMAScript分號自動插入規則可以查看以下連結:
實踐出真理,看一下下面這些例子,就明白,分號自動插入不是那麼好讓人捉摸的。稍微不注意就會讓你頭大。
return引起的血案
以下為引用的內容: function test(){ |
一個傳回a+b值的函數,初步看沒任何問題,但執行alert的結果卻是undefined。根據分號的自動插入規則,return 語句後面如果有換行就會自動插入分號,沒有回傳值也就比較好理解了。如果需要換行的話,可以這樣:
以下為引用的內容: function test(){ (function (){ |
for語句頭中的兩個分號,不會自動插入分號
以下為引用的內容: for( var a=1,b=10 //不會自動插入分號 |
ECMAScript對以上也有解釋:將分號解釋為空語句和在for語句中的()中不自動插入分號是特例,是不屬於自動插入規則管轄的。
javascript雖然是弱型別語言,ECMAScript的分號自動插入規則也讓人難以理解透徹。但養成良好的程式碼書寫習慣,手動插入分號,養成習慣,就能避免這些問題,同時會在程式調試,程式碼的閱讀上對自己對他人都有不小的幫助。
同時ECMAScript也給程式設計師一些建議:
++ 或— 應與其操作數出現在同一行。
return 或throw 語句中的表達式應和return 或throw 出現在同一行。
break 或continue 語句中的標籤應和break 或continue 出現在同一行。