Javascript分號,加仍是不加?

本文同步自個人博客園:http://hustskyking.cnblogs.com函數

關於這個問題,網上已經有不少人討論過了,我先說說本身對這個問題的回答:加!(但非必須)spa

有些人寫代碼,懶得加分號,除非是無可奈何才勉強放一個分號上去。若是你能夠保證你寫的代碼不出現任何 bug,那固然是沒有問題,可是不少 JSer 新人,對一些隱含的問題並非特別清楚,很容易在不知不覺中寫出一堆 bug,咱們先來了解下 JS 詞法語法解析的時候,哪些狀況下會自動插入分號。翻譯

1、自動插入分號的規則

1. 程序從左到右解析,當歸入下一個 token 沒法匹配任何語法: rest

  • 如該 token 跟以前的 token 之間有至少一個 LineTerminal 行終結符違反分割
  • 該 token 爲 `}` 符號時

2. 程序從左到右解析,當歸入下一個(或幾個) token 不能產生一條合法的語句的時候,會在這個地方插入一個分號。code

3. 程序從左到右解析,當歸入的 token 可以產生一條合法語句,可是這條語句是受限產生式時,在該受限 token 前面自動插入分號。blog

上面提到的一些內容來自 ECMAScript5.1 第七章第九節,能夠戳這裏,翻譯的不太通順,實在是太難翻譯了= =token

2、一些不加分號會出問題的場景

場景一: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(),這樣的問題藏的比較深,不容易被發現。

3、規避問題

有些語句是以 [ 或者 ( 開頭,就想上面提到的場景一和場景四,這些 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;

4、小結

看到上面的一些列問題,相信你們內心仍是有本身的答案了,若是你有信心代碼裏頭不出現由於不寫分號而致使的錯誤,那分號的取捨實際上是無所謂的。

相關文章
相關標籤/搜索