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

資訊專欄INFORMATION COLUMN

細(xì)說 Javascript 拾遺篇(三) : 自動插入分號

mushang / 1816人閱讀

摘要:此時會自動插入分號,解析器將再次嘗試。工作原理下面的代碼沒有分號,因此解析器將會自己判斷在哪些地方插入分號。前置小括號在有前置小括號的情形時,解析器將不會自動插入分號。這不僅將保證代碼整體的一致性,也將有效地避免解析器對代碼行為的錯誤改變。

盡管 Javascript 有類似 C 的句法風(fēng)格,但是它并不強(qiáng)制在代碼中使用分號,所以分號可能被省略。
Javascript 并不是一個缺少分號的語言,實際上,它需要分號來解析代碼。因此當(dāng) Javascript 解析器遇到缺少分號而導(dǎo)致錯誤時會自動插入分號。

var foo = function() {
} // parse error, semicolon expected
test()

此時 Javascript 會自動插入分號,解析器將再次嘗試。

var foo = function() {
}; // no error, parser continues
test()

自動的分號插入被認(rèn)為是 Javascript 設(shè)計的缺陷之一,因為它能改變代碼的行為。

工作原理

下面的代碼沒有分號,因此 Javascript 解析器將會自己判斷在哪些地方插入分號。

(function(window, undefined) {
    function test(options) {
        log("testing!")

        (options.list || []).forEach(function(i) {

        })

        options.value.test(
            "long string to pass here",
            "and another long string to pass"
        )

        return
        {
            foo: function() {}
        }
    }
    window.test = test

})(window)

(function(window) {
    window.someLibrary = {}

})(window)

下面是解析器自行猜想后的結(jié)果:

(function(window, undefined) {
    function test(options) {

        // Not inserted, lines got merged
        log("testing!")(options.list || []).forEach(function(i) {

        }); // <- inserted

        options.value.test(
            "long string to pass here",
            "and another long string to pass"
        ); // <- inserted

        return; // <- inserted, breaks the return statement
        { // treated as a block

            // a label and a single expression statement
            foo: function() {} 
        }; // <- inserted
    }
    window.test = test; // <- inserted

// The lines got merged again
})(window)(function(window) {
    window.someLibrary = {}; // <- inserted

})(window); //<- inserted

很明顯,解析器插入分號后已經(jīng)改變了代碼原本的行為。

前置小括號

在有前置小括號的情形時,解析器將不會自動插入分號 。

log("testing!")
(options.list || []).forEach(function(i) {})

代碼將被解析器轉(zhuǎn)換為一行:

log("testing!")(options.list || []).forEach(function(i) {})
總結(jié)

基于以上研究,強(qiáng)烈建議在書寫 Javascript 代碼的時候不要省略分號,同時也建議大括號應(yīng)該與對應(yīng)的表達(dá)式處于同一行,即使 if else 語句只有一句也盡量不要省略大括號。這不僅將保證代碼整體的一致性,也將有效地避免 Javascript 解析器對代碼行為的錯誤改變。

對于是否省略 Javascript 分號,@barretlee 有篇博文寫的很好,尤其是其中的一些例子舉得很有代表性:

  

《Javascript分號,加還是不加?》

JavaScript Garden 接下來一章節(jié)介紹 delete 操作符,由于之前我自己已經(jīng)研究過 delete 相關(guān)機(jī)制 - 《Javascript - Delete 機(jī)制》。因此我不打算再重復(fù)總結(jié)一篇博文。

參考

http://bonsaiden.github.io/JavaScript-Garden/#core.semicolon

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

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

相關(guān)文章

  • 細(xì)說 Javascript 遺篇(二) : undefined 和 null

    摘要:有兩個可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時函數(shù)的表達(dá)式?jīng)]有顯式的返回任何內(nèi)容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標(biāo)準(zhǔn)實行后,全局變量已經(jīng)是不再可寫。 Javascript 有兩個可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。 undefined undefined 是一種值為 un...

    My_Oh_My 評論0 收藏0
  • 細(xì)說 Javascript 遺篇(一) : 遠(yuǎn)離 eval 函數(shù)

    摘要:然而,函數(shù)只有在當(dāng)前作用域中直接被調(diào)用并且被調(diào)用的函數(shù)名為才會被執(zhí)行。在全局作用域下,這個字符串會一直被執(zhí)行,在這個情形下我們并沒有直接調(diào)用函數(shù),也可以執(zhí)行字符串。總結(jié)函數(shù)應(yīng)該盡可能地避免使用。 Javascript 的 eval 函數(shù)可以在當(dāng)前作用域執(zhí)行一段包含 Javascript 代碼的字符串。 var foo = 1; function test() { var fo...

    imtianx 評論0 收藏0
  • 細(xì)說 Javascript 遺篇(四) : setTimeout 和 setInterval

    摘要:當(dāng)間隔時間設(shè)置較小時,將會導(dǎo)致回調(diào)函數(shù)堆積。處理可能阻塞的代碼最簡單且最可控的方式就是在回調(diào)函數(shù)內(nèi)部使用函數(shù)。但是很明顯,由于指定最大值的限制,還會有定時器沒有被清除掉。另外,盡量避免使用函數(shù),從而避免可能導(dǎo)致的回調(diào)函數(shù)堆積現(xiàn)象。 由于 Javascript 是異步的,因此我們可以通過 setTimeout 和 setInterval 函數(shù)來指定特定時間執(zhí)行代碼。 function ...

    wangjuntytl 評論0 收藏0
  • JavaScript ASI 機(jī)制詳解

    摘要:最近在清理的未讀列表,看到了才知道了的,一種自動插入分號的機(jī)制。這種行為被叫做自動插入分號,簡稱。不過在省略分號的風(fēng)格中,這種解析特性會導(dǎo)致一些意外情況。規(guī)則標(biāo)準(zhǔn)定義的包括三條規(guī)則和兩條例外。規(guī)則一情況三就是為量身定做的。 TL;DR 最近在清理 Pocket 的未讀列表,看到了 An Open Letter to JavaScript Leaders Regarding Semico...

    frontoldman 評論0 收藏0
  • Javascript分號,加還是不加?

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

    Coding01 評論0 收藏0

發(fā)表評論

0條評論

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