摘要:此時會自動插入分號,解析器將再次嘗試。工作原理下面的代碼沒有分號,因此解析器將會自己判斷在哪些地方插入分號。前置小括號在有前置小括號的情形時,解析器將不會自動插入分號。這不僅將保證代碼整體的一致性,也將有效地避免解析器對代碼行為的錯誤改變。
盡管 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
摘要:有兩個可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時函數(shù)的表達(dá)式?jīng)]有顯式的返回任何內(nèi)容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標(biāo)準(zhǔn)實行后,全局變量已經(jīng)是不再可寫。 Javascript 有兩個可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。 undefined undefined 是一種值為 un...
摘要:然而,函數(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...
摘要:當(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 ...
摘要:最近在清理的未讀列表,看到了才知道了的,一種自動插入分號的機(jī)制。這種行為被叫做自動插入分號,簡稱。不過在省略分號的風(fēng)格中,這種解析特性會導(dǎo)致一些意外情況。規(guī)則標(biāo)準(zhǔn)定義的包括三條規(guī)則和兩條例外。規(guī)則一情況三就是為量身定做的。 TL;DR 最近在清理 Pocket 的未讀列表,看到了 An Open Letter to JavaScript Leaders Regarding Semico...
摘要:本文同步自我的博客園關(guān)于這個問題,網(wǎng)上已經(jīng)有很多人討論過了,我先說說自己對這個問題的回答加但非必須有些人寫代碼,懶得加分號,除非是迫不得已才勉強(qiáng)放一個分號上去。 本文同步自我的博客園:http://hustskyking.cnblogs.com 關(guān)于這個問題,網(wǎng)上已經(jīng)有很多人討論過了,我先說說自己對這個問題的回答:加!(但非必須) 有些人寫代碼,懶得加分號,除非是迫不得已才勉強(qiáng)放一...
閱讀 2609·2021-09-28 09:35
閱讀 3262·2021-09-03 10:28
閱讀 2905·2019-08-30 15:43
閱讀 1477·2019-08-30 14:04
閱讀 1801·2019-08-29 17:02
閱讀 1812·2019-08-26 13:59
閱讀 692·2019-08-26 11:51
閱讀 3251·2019-08-23 17:16