摘要:本文同步自我的博客園關于這個問題,網上已經有很多人討論過了,我先說說自己對這個問題的回答加但非必須有些人寫代碼,懶得加分號,除非是迫不得已才勉強放一個分號上去。
本文同步自我的博客園:http://hustskyking.cnblogs.com
關于這個問題,網上已經有很多人討論過了,我先說說自己對這個問題的回答:加!(但非必須)
有些人寫代碼,懶得加分號,除非是迫不得已才勉強放一個分號上去。如果你可以保證你寫的代碼不出現任何 bug,那當然是沒有問題,但是很多 JSer 新人,對一些隱含的問題并不是特別清楚,很容易在不知不覺中寫出一堆 bug,我們先來了解下 JS 詞法語法解析的時候,哪些情況下會自動插入分號。
一、自動插入分號的規則1. 程序從左到右解析,當納入下一個 token 無法匹配任何語法:
如該 token 跟之前的 token 之間有至少一個 LineTerminal 行終結符違反分割
該 token 為 `}` 符號時
2. 程序從左到右解析,當納入下一個(或幾個) token 不能產生一條合法的語句的時候,會在這個地方插入一個分號。
3. 程序從左到右解析,當納入的 token 能夠產生一條合法語句,但是這條語句是受限產生式時,在該受限 token 前面自動插入分號。
上面提到的一些內容來自 ECMAScript5.1 第七章第九節,可以戳這里,翻譯的不太通順,實在是太難翻譯了= =
二、一些不加分號會出問題的場景場景一:
s = a + b (x + y).doSomething()
我們期望這是這是兩條語句,結果會被解析成:
s = a + b(x + y).doSomething();
b 在這里成了一個函數了。
場景二:
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()
這也是為什么我們會經??吹絼e人的代碼中寫出這樣的函數:
;(function(){ // ... })();
在 function 的前面加了一個分號,目的就是為了防止整個函數的返回值作為參數送入上一條語句之中。
對于場景三,要特別說明一下,除了 return 之外,還有 break 和 continue 語句,break 和 continue 類似 C 語言中的 goto ,他是可以在后面添加 tag 的,如果 tag 和 這些關鍵詞之間存在 LineTerminal ,這些 tag 就會被忽略,如:
break tag
我們期望程序會調到 tag 所指向的程序段,但結果被解析成
break; tag;四、小結
看到上面的一些列問題,相信大家心里還是有自己的答案了,如果你有信心代碼里頭不出現因為不寫分號而導致的錯誤,那分號的取舍其實是無所謂的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87485.html
摘要:問題前一陣子猛然想到一個問題有分號自動補全機制在寫時我是習慣性在語句后面加上分號在塊語句后面不加分號。關于加不加分號的問題知乎上一些回答這個問題的大佬普遍意見是喜歡就好。 問題 前一陣子猛然想到一個問題,JS有分號自動補全(ASI)機制,在寫JS時我是習慣性在語句后面加上分號,在塊語句后面不加分號。那么如果沒有加分號的話,在什么情況下會出現問題?在JS語句后到底是應該加分號還是不加分號...
摘要:在以下的種情況是用回車或換行,是不會作自動插入分號來讓語句作結尾。以下情況必用分號。但有例外,賦值時可以加分號是對的語法。 起因 這個文章一開始回覆于這篇回答中: javascript初級問題 也有之前的朋友寫信來問,因為在讀到我個人寫的一本電子書: 從ES6開始的JavaScript學習生活,繁體,gitbook。我在寫作風格里有說明,這本電子書中的范例都是使用不用分號(;)作為代碼...
摘要:構造函數很多教程都告訴我們,不要直接用內置對象的構造函數來創建基本變量,例如的寫法就應該用的寫法來取代。但是,構造函數注意是大寫的有點特別。構造函數接受的參數中,第一個是要傳入的參數名,第二個是函數內的代碼用字符串來表示。 如何寫JavaScript才能逼格更高呢?怎樣才能組織JavaScript才能讓別人一眼看出你不簡單呢?是否很期待別人在看完你的代碼之后感嘆一句原來還可以這樣寫呢?...
摘要:為什么要編寫可維護的軟件生命周期的成本消耗在了維護上。相等具有強制類型轉換的機制。檢測字符串檢測數字檢測布爾值檢測檢測引用值引用值也稱為對象,檢測某個引用值的類型的官方最好的方法是使用運算符。 為什么要編寫可維護的javascript? 軟件生命周期80%的成本消耗在了維護上。 幾乎所有的軟件維護者都不是它的最初作者。 編碼規范提高了軟件的可讀性,它讓工程師能夠快速且充分地理解新的代...
摘要:為什么要編寫可維護的軟件生命周期的成本消耗在了維護上。相等具有強制類型轉換的機制。檢測字符串檢測數字檢測布爾值檢測檢測引用值引用值也稱為對象,檢測某個引用值的類型的官方最好的方法是使用運算符。 為什么要編寫可維護的javascript? 軟件生命周期80%的成本消耗在了維護上。 幾乎所有的軟件維護者都不是它的最初作者。 編碼規范提高了軟件的可讀性,它讓工程師能夠快速且充分地理解新的代...
閱讀 3486·2021-11-12 10:36
閱讀 2857·2021-09-22 15:35
閱讀 2807·2021-09-04 16:41
閱讀 1163·2019-08-30 15:55
閱讀 3574·2019-08-29 18:43
閱讀 2070·2019-08-23 18:24
閱讀 1412·2019-08-23 18:10
閱讀 1921·2019-08-23 11:31