摘要:中分號自動插入轉(zhuǎn)譯自鏈接描述在中,分號自動插入機(jī)制允許在一行代碼結(jié)尾省略分號。比如分號自動插入規(guī)則分號插入只是一個術(shù)語。如果在這些位置遇到換行了,分號將被插入。
JavaScript中分號自動插入
轉(zhuǎn)譯自:鏈接描述
在JavaScript中,分號自動插入機(jī)制允許在一行代碼結(jié)尾省略分號。你應(yīng)該養(yǎng)成一直書寫分號的習(xí)慣,與此同時掌握J(rèn)avaScript分號省略處理機(jī)制是十分重要的。因?yàn)檫@不僅有助于你去理解省略分號的代碼,而且對于那些沒有省略分號的代碼也能有更深層次的理解。
首先,我要介紹一些和本文剩余部分相關(guān)的語法現(xiàn)象,方便大家理解。
表達(dá)式VS語句表達(dá)式:經(jīng)計(jì)算后會有一個值。
3 * Math.sqrt(x) i++ obj.prop [ "a", "b", "c" ] { first: "Jane", last: "Doe" } function() {} // function expression
語句:程序是由一系列語句組成。
for(var i=0; i<3; i++) { console.log(i); } function twice(x) { // function declaration return 2 * x; } var foo = twice(21); // assignment
注意,賦值語句右邊是一個表達(dá)式。
語句應(yīng)該以分號結(jié)尾:在JavaScript中,任何語句都應(yīng)該以分號結(jié)尾,但下面這些例外。、
循環(huán)語句:for,while(不是do while)
分支語句:if,switch,try
函數(shù)聲明(不是函數(shù)表達(dá)式)
示例1:while VS do while
while(a > 0) { a--; } // no semicolon do { a--; } while(a > 0);
示例2:函數(shù)聲明 VS 函數(shù)表達(dá)式
function foo() { } // no semicolon var foo = function() { };
注意,當(dāng)你在上述提及到的語句后面加了分號,瀏覽器不會提示你有語法錯誤,因?yàn)樗灰曌鳛橐粋€空語句。
空語句。當(dāng)一個分號多帶帶出現(xiàn)的時候,它代表一個空語句,什么也不會做。空語句可以出現(xiàn)在任何語句可以出現(xiàn)的地方。當(dāng)一個語句是被需要的,但是又不需要這個語句完成什么功能的時候,空語句是非常有用的。在這種情況下,塊代碼也是允許的,不過一個空語句塊要比一個分號要長。舉個例子,西面兩個語句是等價的:
while(processNextItem() > 0); while(processNextItem() > 0) {}
下面的程序在語法上也是正確的:三個空語句。
;;;
表達(dá)式作為語句任何表達(dá)式都可以轉(zhuǎn)換為語句,只需在表達(dá)式結(jié)尾加一個分號就可以了。比如:
"hello world"; a + b; sum(5, 3); a++;分號自動插入規(guī)則(ASI)
分號插入只是一個術(shù)語。它并不意味著代碼在解析的時候就真的被插入了分號。
相反,它只是一個很好的 用來解釋當(dāng)分號可有可無的情況下的 比喻說法。
規(guī)范:解析器把每一個新的記號當(dāng)做當(dāng)前語句的一部分,除非有一個分號來結(jié)束它。下面給出的示例代碼,你也許會以為一個分號應(yīng)該被插入,但實(shí)際上沒有。下面例子闡明了忽略分號的危險。
NO ASI:
a = b + c (d + e).print()
上述代碼不會觸發(fā)ASI,因?yàn)樽罄ㄌ柨梢愿贑后面作為函數(shù)調(diào)用。因此,上述代碼被解釋為:
a = b + c(d + e).print();
NO ASI:
a = b /hi/g.exec(c).map(d);
沒有分號插入,第二條語句不會被解釋為正則表達(dá)式。上述代碼等價于:
a = b / hi / g.exec(c).map(d);
NO ASI:
var foo = "bar" [ "red", "green" ].foreach(function(c) { console.log(c) })
沒有分號被插入。相反,第二行代碼開頭被解釋為字符串“bar”的下標(biāo)索引。由于逗號運(yùn)算符的存在,方括號的逗號能夠被解釋器解釋。
NO ASI:
在很多瀏覽器中,下面的代碼中的func被賦值為0,因?yàn)閍++被解釋為上一行的函數(shù)表達(dá)式的參數(shù)。
var a = 0; var func = function(x) { return x } (a++)
規(guī)范的例外:在下面的例子中ASI機(jī)制被應(yīng)用。
換行加上非法的記號符:如果遇到了換行,并且接下來一行的代碼被添加在上面代碼中不能組成合法的語句,此時分號會被插入。
舉個例子:
if (a < 0) a = 0 console.log(a)
上述代碼會觸發(fā)ASI機(jī)制,被解釋為下面的語句:
if (a < 0) a = 0; console.log(a);
禁止的行結(jié)束符:下面的句法結(jié)構(gòu)中在特定位置禁止換行。如果在這些位置遇到換行了,分號將被插入。在ECMAScript標(biāo)準(zhǔn)中稱下述語法規(guī)則為限制生產(chǎn)( 英文為restricted productions,暫且直譯)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/83097.html
摘要:花點(diǎn)時間搞清楚中的分號規(guī)則吧不管你喜歡結(jié)尾帶分號或省略分號的模式分號允許的場景分號一般允許出現(xiàn)在大部分語句的末尾,比如等栗子僅有一個分號可以表示空語句在中合法,比如可解析為三個空語句空語句可用于輔助產(chǎn)生語法合法的解析結(jié)果,如如果沒有末尾的 花點(diǎn)時間搞清楚JS中的分號規(guī)則吧~~~不管你喜歡結(jié)尾帶分號或省略分號的模式 分號允許的場景 分號一般允許出現(xiàn)在大部分語句(statement)的末尾...
摘要:此時會自動插入分號,解析器將再次嘗試。工作原理下面的代碼沒有分號,因此解析器將會自己判斷在哪些地方插入分號。前置小括號在有前置小括號的情形時,解析器將不會自動插入分號。這不僅將保證代碼整體的一致性,也將有效地避免解析器對代碼行為的錯誤改變。 盡管 Javascript 有類似 C 的句法風(fēng)格,但是它并不強(qiáng)制在代碼中使用分號,所以分號可能被省略。Javascript 并不是一個缺少分號的...
摘要:在以下的種情況是用回車或換行,是不會作自動插入分號來讓語句作結(jié)尾。以下情況必用分號。但有例外,賦值時可以加分號是對的語法。 起因 這個文章一開始回覆于這篇回答中: javascript初級問題 也有之前的朋友寫信來問,因?yàn)樵谧x到我個人寫的一本電子書: 從ES6開始的JavaScript學(xué)習(xí)生活,繁體,gitbook。我在寫作風(fēng)格里有說明,這本電子書中的范例都是使用不用分號(;)作為代碼...
摘要:一自動插入分號規(guī)則三條規(guī)則要有換行符,且下一個符號是不符合語法的,那么就嘗試插入分號。有換行符,且語法中規(guī)定此處不能有換行符,那么就自動插入分號。源代碼結(jié)束處,不能形成完整的腳本或者模塊結(jié)構(gòu),那么就自動插入分號。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整...
閱讀 1731·2021-09-26 09:55
閱讀 5692·2021-09-22 15:40
閱讀 2074·2019-08-30 15:53
閱讀 1547·2019-08-30 11:15
閱讀 1766·2019-08-29 15:41
閱讀 1925·2019-08-28 18:13
閱讀 3209·2019-08-26 12:00
閱讀 1723·2019-08-26 10:30