成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

細(xì)說(shuō) Javascript 拾遺篇(三) : 自動(dòng)插入分號(hào)

mushang / 1902人閱讀

摘要:此時(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 有類(lèi)似 C 的句法風(fēng)格,但是它并不強(qiáng)制在代碼中使用分號(hào),所以分號(hào)可能被省略。
Javascript 并不是一個(gè)缺少分號(hào)的語(yǔ)言,實(shí)際上,它需要分號(hào)來(lái)解析代碼。因此當(dāng) Javascript 解析器遇到缺少分號(hào)而導(dǎo)致錯(cuò)誤時(shí)會(huì)自動(dòng)插入分號(hào)。

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

此時(shí) Javascript 會(huì)自動(dòng)插入分號(hào),解析器將再次嘗試。

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

自動(dòng)的分號(hào)插入被認(rèn)為是 Javascript 設(shè)計(jì)的缺陷之一,因?yàn)樗芨淖兇a的行為。

工作原理

下面的代碼沒(méi)有分號(hào),因此 Javascript 解析器將會(huì)自己判斷在哪些地方插入分號(hào)。

(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

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

前置小括號(hào)

在有前置小括號(hào)的情形時(shí),解析器將不會(huì)自動(dòng)插入分號(hào) 。

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

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

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

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

對(duì)于是否省略 Javascript 分號(hào),@barretlee 有篇博文寫(xiě)的很好,尤其是其中的一些例子舉得很有代表性:

  

《Javascript分號(hào),加還是不加?》

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

參考

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78116.html

相關(guān)文章

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

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

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

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

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

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

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

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

    frontoldman 評(píng)論0 收藏0
  • Javascript分號(hào),加還是不加?

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

    Coding01 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<