国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript分號,加還是不加?

Coding01 / 3277人閱讀

摘要:本文同步自我的博客園關(guān)于這個問題,網(wǎng)上已經(jīng)有很多人討論過了,我先說說自己對這個問題的回答加但非必須有些人寫代碼,懶得加分號,除非是迫不得已才勉強(qiáng)放一個分號上去。

本文同步自我的博客園:http://hustskyking.cnblogs.com

關(guān)于這個問題,網(wǎng)上已經(jīng)有很多人討論過了,我先說說自己對這個問題的回答:加!(但非必須)

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

一、自動插入分號的規(guī)則

1. 程序從左到右解析,當(dāng)納入下一個 token 無法匹配任何語法:

如該 token 跟之前的 token 之間有至少一個 LineTerminal 行終結(jié)符違反分割

該 token 為 `}` 符號時

2. 程序從左到右解析,當(dāng)納入下一個(或幾個) token 不能產(chǎn)生一條合法的語句的時候,會在這個地方插入一個分號。

3. 程序從左到右解析,當(dāng)納入的 token 能夠產(chǎn)生一條合法語句,但是這條語句是受限產(chǎn)生式時,在該受限 token 前面自動插入分號。

上面提到的一些內(nèi)容來自 ECMAScript5.1 第七章第九節(jié),可以戳這里,翻譯的不太通順,實(shí)在是太難翻譯了= =

二、一些不加分號會出問題的場景

場景一:

s = a + b
(x + y).doSomething()

我們期望這是這是兩條語句,結(jié)果會被解析成:

s = a + b(x + y).doSomething();

b 在這里成了一個函數(shù)了。

場景二:

x
++
y

這個 ++ 符號會給誰?答案是:

x; ++y;

這樣的代碼當(dāng)然是很少遇到,但是遇到這種情況:

場景三:

return 
true

我們期望返回 true,結(jié)果:

return;
true;

給我們返回了 undefined。

場景四:

s = function(x){return x}
(1 + 2).toString()

他被解析成了

s = function(x){return x}(1 + 2).toString()

function(x){return x}(1 + 2) 這個作為一個整體,1+2 作為參數(shù)送入函數(shù),該函數(shù)的返回值為 3,然后執(zhí)行 3.toString(),這樣的問題藏的比較深,不容易被發(fā)現(xiàn)。

三、規(guī)避問題

有些語句是以 [ 或者 ( 開頭,就想上面提到的場景一和場景四,這些 token 很容易和上一條沒有加分號的語句合并到一起,如果你不太喜歡加分號,可以這樣來處理:

s = function(x){return x}
;(1 + 2).toString()

這也是為什么我們會經(jīng)??吹絼e人的代碼中寫出這樣的函數(shù):

;(function(){
    // ...
})();

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

對于場景三,要特別說明一下,除了 return 之外,還有 break 和 continue 語句,break 和 continue 類似 C 語言中的 goto ,他是可以在后面添加 tag 的,如果 tag 和 這些關(guān)鍵詞之間存在 LineTerminal ,這些 tag 就會被忽略,如:

break
tag

我們期望程序會調(diào)到 tag 所指向的程序段,但結(jié)果被解析成

break;
tag;
四、小結(jié)

看到上面的一些列問題,相信大家心里還是有自己的答案了,如果你有信心代碼里頭不出現(xiàn)因?yàn)椴粚懛痔柖鴮?dǎo)致的錯誤,那分號的取舍其實(shí)是無所謂的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87485.html

相關(guān)文章

  • JS語句后分號

    摘要:問題前一陣子猛然想到一個問題有分號自動補(bǔ)全機(jī)制在寫時我是習(xí)慣性在語句后面加上分號在塊語句后面不加分號。關(guān)于加不加分號的問題知乎上一些回答這個問題的大佬普遍意見是喜歡就好。 問題 前一陣子猛然想到一個問題,JS有分號自動補(bǔ)全(ASI)機(jī)制,在寫JS時我是習(xí)慣性在語句后面加上分號,在塊語句后面不加分號。那么如果沒有加分號的話,在什么情況下會出現(xiàn)問題?在JS語句后到底是應(yīng)該加分號還是不加分號...

    OnlyLing 評論0 收藏0
  • JavaScript里的語句用分號結(jié)尾是個選項(xiàng)嗎

    摘要:在以下的種情況是用回車或換行,是不會作自動插入分號來讓語句作結(jié)尾。以下情況必用分號。但有例外,賦值時可以加分號是對的語法。 起因 這個文章一開始回覆于這篇回答中: javascript初級問題 也有之前的朋友寫信來問,因?yàn)樵谧x到我個人寫的一本電子書: 從ES6開始的JavaScript學(xué)習(xí)生活,繁體,gitbook。我在寫作風(fēng)格里有說明,這本電子書中的范例都是使用不用分號(;)作為代碼...

    stormzhang 評論0 收藏0
  • JavaScript裝逼指南

    摘要:構(gòu)造函數(shù)很多教程都告訴我們,不要直接用內(nèi)置對象的構(gòu)造函數(shù)來創(chuàng)建基本變量,例如的寫法就應(yīng)該用的寫法來取代。但是,構(gòu)造函數(shù)注意是大寫的有點(diǎn)特別。構(gòu)造函數(shù)接受的參數(shù)中,第一個是要傳入的參數(shù)名,第二個是函數(shù)內(nèi)的代碼用字符串來表示。 如何寫JavaScript才能逼格更高呢?怎樣才能組織JavaScript才能讓別人一眼看出你不簡單呢?是否很期待別人在看完你的代碼之后感嘆一句原來還可以這樣寫呢?...

    oneasp 評論0 收藏0
  • 編寫可維護(hù)的javascript

    摘要:為什么要編寫可維護(hù)的軟件生命周期的成本消耗在了維護(hù)上。相等具有強(qiáng)制類型轉(zhuǎn)換的機(jī)制。檢測字符串檢測數(shù)字檢測布爾值檢測檢測引用值引用值也稱為對象,檢測某個引用值的類型的官方最好的方法是使用運(yùn)算符。 為什么要編寫可維護(hù)的javascript? 軟件生命周期80%的成本消耗在了維護(hù)上。 幾乎所有的軟件維護(hù)者都不是它的最初作者。 編碼規(guī)范提高了軟件的可讀性,它讓工程師能夠快速且充分地理解新的代...

    singerye 評論0 收藏0
  • 編寫可維護(hù)的javascript

    摘要:為什么要編寫可維護(hù)的軟件生命周期的成本消耗在了維護(hù)上。相等具有強(qiáng)制類型轉(zhuǎn)換的機(jī)制。檢測字符串檢測數(shù)字檢測布爾值檢測檢測引用值引用值也稱為對象,檢測某個引用值的類型的官方最好的方法是使用運(yùn)算符。 為什么要編寫可維護(hù)的javascript? 軟件生命周期80%的成本消耗在了維護(hù)上。 幾乎所有的軟件維護(hù)者都不是它的最初作者。 編碼規(guī)范提高了軟件的可讀性,它讓工程師能夠快速且充分地理解新的代...

    weknow619 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<