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