Javascript分號,加還是不加?

2021-09-22 08:36:57 字數 1542 閱讀 6705

關於這個問題,網上已經有很多人討論過了,我先說說自己對這個問題的回答:加!(但非必須)

有些人寫**,懶得加分號,除非是迫不得已才勉強放乙個分號上去。如果你可以保證你寫的**不出現任何 bug,那當然是沒有問題,但是很多 jser 新人,對一些隱含的問題並不是特別清楚,很容易在不知不覺中寫出一堆 bug,我們先來了解下 js 詞法語法解析的時候,哪些情況下會自動插入分號。

注:滑鼠滑過文字可以看到翻譯原文

1. 程式從左到右解析,當納入下乙個 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)

(1 + 2).tostring()

他被解析成了

s = function(x)(1 + 2).tostring()

function(x)(1 + 2)這個作為乙個整體,1+2 作為引數送入函式,該函式的返回值為 3,然後執行 3.tostring(),這樣的問題藏的比較深,不容易被發現。

s = function(x)

;(1 + 2).tostring()

這也是為什麼我們會經常看到別人的**中寫出這樣的函式:

;(function

())();

在 function 的前面加了乙個分號,目的就是為了防止整個函式的返回值作為引數送入上一條語句之中。

break

tag

我們期望程式會調到 tag 所指向的程式段,但結果被解析成

break

;tag;

flutter分號還是逗號

小結下flutter分號還是逗號,開始的時候都不知道到底要輸入哪個符號 還是有點亂,供自己記錄檢視下 container含 margin,heght,child child 含listview或者column column含有children listview 含scrolldirection方向 ...

javascript實現base64加解密

1.瀏覽器自帶方法 加密 124 mti0 btoa 124 解密 mti0 124 atob 124 瀏覽器自帶的方法只支援拉丁文 2.呼叫開源的base64.js 1.加密解密方法使用 1.加密 var str 124中文內容 var base new base64 var result bas...

豆腐腦加滷還是加糖

今天早上到所裡吃早餐,要了一碗不加滷的豆腐腦。正想轉身走的時候,服務員妹妹突然詫異地問道 不放滷怎麼吃呀?我更詫異的說 加糖呀 不知是我被她雷到了,還是她被我雷到了,抑或我們互相被雷到了。看來,各個地方的人對吃豆腐腦還是有不同的講究。我在廣西的時候,基本上不知道有豆腐腦這東西 孤陋寡聞了 到了武漢,...