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