本文同步自個人博客園:http://hustskyking.cnblogs.com函數
關於這個問題,網上已經有不少人討論過了,我先說說本身對這個問題的回答:加!(但非必須)spa
有些人寫代碼,懶得加分號,除非是無可奈何才勉強放一個分號上去。若是你能夠保證你寫的代碼不出現任何 bug,那固然是沒有問題,可是不少 JSer 新人,對一些隱含的問題並非特別清楚,很容易在不知不覺中寫出一堆 bug,咱們先來了解下 JS 詞法語法解析的時候,哪些狀況下會自動插入分號。翻譯
1. 程序從左到右解析,當歸入下一個 token 沒法匹配任何語法: rest
2. 程序從左到右解析,當歸入下一個(或幾個) token 不能產生一條合法的語句的時候,會在這個地方插入一個分號。code
3. 程序從左到右解析,當歸入的 token 可以產生一條合法語句,可是這條語句是受限產生式時,在該受限 token 前面自動插入分號。blog
上面提到的一些內容來自 ECMAScript5.1 第七章第九節,能夠戳這裏,翻譯的不太通順,實在是太難翻譯了= =token
場景一:ip
s = a + b (x + y).doSomething()
咱們指望這是這是兩條語句,結果會被解析成:terminal
s = a + b(x + y).doSomething();
b 在這裏成了一個函數了。get
場景二:
x ++ y
這個 ++ 符號會給誰?答案是:
x; ++y;
這樣的代碼固然是不多遇到,可是遇到這種狀況:
場景三:
return true
咱們指望返回 true,結果:
return; true;
給咱們返回了 undefined。
場景四:
s = function(x){return x} (1 + 2).toString()
他被解析成了
s = function(x){return x}(1 + 2).toString()
function(x){return x}(1 + 2)
這個做爲一個總體,1+2 做爲參數送入函數,該函數的返回值爲 3,而後執行 3.toString(),這樣的問題藏的比較深,不容易被發現。
有些語句是以 [
或者 (
開頭,就想上面提到的場景一和場景四,這些 token 很容易和上一條沒有加分號的語句合併到一塊兒,若是你不太喜歡加分號,能夠這樣來處理:
s = function(x){return x} ;(1 + 2).toString()
這也是爲何咱們會常常看到別人的代碼中寫出這樣的函數:
;(function(){ // ... })();
在 function 的前面加了一個分號,目的就是爲了防止整個函數的返回值做爲參數送入上一條語句之中。
對於場景三,要特別說明一下,除了 return 以外,還有 break 和 continue 語句,break 和 continue 相似 C 語言中的 goto ,他是能夠在後面添加 tag 的,若是 tag 和 這些關鍵詞之間存在 LineTerminal ,這些 tag 就會被忽略,如:
break tag
咱們指望程序會調到 tag 所指向的程序段,但結果被解析成
break; tag;
看到上面的一些列問題,相信你們內心仍是有本身的答案了,若是你有信心代碼裏頭不出現由於不寫分號而致使的錯誤,那分號的取捨實際上是無所謂的。