摘要:此時(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
摘要:有兩個(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...
摘要:然而,函數(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...
摘要:當(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 ...
摘要:最近在清理的未讀列表,看到了才知道了的,一種自動(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...
摘要:本文同步自我的博客園關(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)放一...
閱讀 2681·2021-09-28 09:35
閱讀 3318·2021-09-03 10:28
閱讀 2974·2019-08-30 15:43
閱讀 1531·2019-08-30 14:04
閱讀 1887·2019-08-29 17:02
閱讀 1882·2019-08-26 13:59
閱讀 784·2019-08-26 11:51
閱讀 3349·2019-08-23 17:16