摘要:規范理論標準定義了自動分號插入規則,包括以下三個基本規則加兩個前置條件前置條件如果插入分號后解析結果是空語句,那么不會自動插入分號。
規范理論
es5 標準定義了自動分號插入規則,包括以下三個基本規則加兩個前置條件:
前置條件
1、如果插入分號后解析結果是空語句,那么不會自動插入分號。
例子:(空語句,else 前不加分好)
if (a > b)
else c = d
2、如果插入分號后它成為 for 語句頭部的兩個分號之一,那么不會自動插入分號。
例子:(不會加分號)
for (a; b
)
基本規則
左到右解析程序,當遇到一個不符合任何文法產生式的 token(叫做 違規 token(offending token)),那么只要滿足下面條件之一就在違規 token 前面自動插入分號。
1、至少一個 LineTerminator 分割了違規 token 和前一個 token。 2、違規 token 是 }。
例子:(1、2不符合任何產生式,并且之間存在 LineTerminator,因此在違規 token 2前加了分好,2和}則是因為違規 token 是 }所以加了分號)
{ 1
2 } 3
{ 1
;2 ;} 3;
左到右解析程序,tokens 輸入流已經結束,當解析器無法將輸入 token 流解析成單個完整 ECMAScript 程序 ,那么就在輸入流的結束位置自動插入分號。
對于受限產生式,也就是下面的5個,我們把產生式 [no LineTerminator here]后面的 token 叫做受限 token,如果在 token 和 受限 token 間存在了至少一個 LineTerminator,那么會在受限 token 前自動加上 token。
受限的產生式只限如下5個:
PostfixExpression :
LeftHandSideExpression [no LineTerminator here] ++ LeftHandSideExpression [no LineTerminator here] --
ContinueStatement :
continue [no LineTerminator here] Identifier;
BreakStatement :
break [no LineTerminator here] Identifier;
ReturnStatement :
return [no LineTerminator here] Expression;
ThrowStatement : throw [no LineTerminator here] Expression;
歸納
避免 ASI 帶來的問題
1、后綴運算符 ++ 或 -- 和它的操作數應該出現在同一行。 2、return 或 throw 語句的表達式開始位置應該和 return 或 throw token 同一行。 3、break 或 continue 語句的標示符應該和 break 或 continue token 同一行。
何時加分號
無分號黨想要不加分號,那么就需要知道什么時候應該要加分號。網上的一篇文章歸納了 NO ASI 并且會出現錯誤的幾種情況,在這幾種情況下我們是要加分號的。下面是對應的描述:
在以 ([/+- 開頭的語句前加分號(由于正常寫法均不會出現以 .,*% 作為語句開頭,因此只需記住前面5個即可,你看能懶則懶哦)
不過這里只考慮了換行的情況,其實 ASI 還存在不換行的情況,這就要根據標準里的三條規則行事了!
知道了這點,其實我們就可以省略大部分的分號了。但是也不強求,因為這還是要根據個人習慣以及團隊風格走的。
小補充
為什么自執行函數前要加分號?
主要是應對代碼合并壓縮時,由于缺少分號;帶來的錯誤。知道了上面的規則,在 ( 開頭的行前加分號就可以避免錯誤了。
原文地址:https://www.jb51.net/article/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96448.html
摘要:最近在清理的未讀列表,看到了才知道了的,一種自動插入分號的機制。這種行為被叫做自動插入分號,簡稱。不過在省略分號的風格中,這種解析特性會導致一些意外情況。規則標準定義的包括三條規則和兩條例外。規則一情況三就是為量身定做的。 TL;DR 最近在清理 Pocket 的未讀列表,看到了 An Open Letter to JavaScript Leaders Regarding Semico...
摘要:中分號自動插入轉譯自鏈接描述在中,分號自動插入機制允許在一行代碼結尾省略分號。比如分號自動插入規則分號插入只是一個術語。如果在這些位置遇到換行了,分號將被插入。 JavaScript中分號自動插入 轉譯自:鏈接描述在JavaScript中,分號自動插入機制允許在一行代碼結尾省略分號。你應該養成一直書寫分號的習慣,與此同時掌握JavaScript分號省略處理機制是十分重要的。因為這不僅有...
摘要:行結束符之后的符號有二義性,使得該符號與上條語句能夠無縫對接,不導致語法錯誤。然而在中,有幾種特殊語句是不允許行結束符存在的。如果語句中有行結束符,會優先認為行結束符表示的是語句的結束,這在標準中稱為限制產生式。 showImg(https://segmentfault.com/img/bVmyZB); 什么是 ASI ? 自動分號插入 (automatic semicolon i...
摘要:這段代碼工作正常,盡管沒有用分號在某些場景下是很管用的,特別是,有時候可以幫助減少代碼錯誤。比如不好的寫法盡管這段代碼能正常工作,但代碼中我們應盡量避免使用。前言 在我們平時工作中寫代碼是最頻繁的事情了,但我們的代碼真的好看嗎? 預計本文閱讀時間(10分鐘) 正文 1.1--語句結尾 我們來看一段代碼 //合法的代碼 var name = Dreams; function sayName(...
摘要:問題前一陣子猛然想到一個問題有分號自動補全機制在寫時我是習慣性在語句后面加上分號在塊語句后面不加分號。關于加不加分號的問題知乎上一些回答這個問題的大佬普遍意見是喜歡就好。 問題 前一陣子猛然想到一個問題,JS有分號自動補全(ASI)機制,在寫JS時我是習慣性在語句后面加上分號,在塊語句后面不加分號。那么如果沒有加分號的話,在什么情況下會出現問題?在JS語句后到底是應該加分號還是不加分號...
閱讀 3471·2021-11-18 10:02
閱讀 3714·2021-09-13 10:25
閱讀 1926·2021-07-26 23:38
閱讀 2573·2019-08-30 15:44
閱讀 2277·2019-08-30 13:51
閱讀 1231·2019-08-26 11:35
閱讀 2276·2019-08-26 10:29
閱讀 3447·2019-08-23 14:56