摘要:此時會自動插入分號,解析器將再次嘗試。工作原理下面的代碼沒有分號,因此解析器將會自己判斷在哪些地方插入分號。前置小括號在有前置小括號的情形時,解析器將不會自動插入分號。這不僅將保證代碼整體的一致性,也將有效地避免解析器對代碼行為的錯誤改變。
盡管 Javascript 有類似 C 的句法風格,但是它并不強制在代碼中使用分號,所以分號可能被省略。
Javascript 并不是一個缺少分號的語言,實際上,它需要分號來解析代碼。因此當 Javascript 解析器遇到缺少分號而導致錯誤時會自動插入分號。
var foo = function() { } // parse error, semicolon expected test()
此時 Javascript 會自動插入分號,解析器將再次嘗試。
var foo = function() { }; // no error, parser continues test()
自動的分號插入被認為是 Javascript 設計的缺陷之一,因為它能改變代碼的行為。
工作原理下面的代碼沒有分號,因此 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)
下面是解析器自行猜想后的結果:
(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
很明顯,解析器插入分號后已經改變了代碼原本的行為。
前置小括號在有前置小括號的情形時,解析器將不會自動插入分號 。
log("testing!") (options.list || []).forEach(function(i) {})
代碼將被解析器轉換為一行:
log("testing!")(options.list || []).forEach(function(i) {})總結
基于以上研究,強烈建議在書寫 Javascript 代碼的時候不要省略分號,同時也建議大括號應該與對應的表達式處于同一行,即使 if else 語句只有一句也盡量不要省略大括號。這不僅將保證代碼整體的一致性,也將有效地避免 Javascript 解析器對代碼行為的錯誤改變。
對于是否省略 Javascript 分號,@barretlee 有篇博文寫的很好,尤其是其中的一些例子舉得很有代表性:
《Javascript分號,加還是不加?》
JavaScript Garden 接下來一章節介紹 delete 操作符,由于之前我自己已經研究過 delete 相關機制 - 《Javascript - Delete 機制》。因此我不打算再重復總結一篇博文。
參考http://bonsaiden.github.io/JavaScript-Garden/#core.semicolon
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78116.html
摘要:有兩個可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時函數的表達式沒有顯式的返回任何內容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標準實行后,全局變量已經是不再可寫。 Javascript 有兩個可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。 undefined undefined 是一種值為 un...
摘要:然而,函數只有在當前作用域中直接被調用并且被調用的函數名為才會被執行。在全局作用域下,這個字符串會一直被執行,在這個情形下我們并沒有直接調用函數,也可以執行字符串??偨Y函數應該盡可能地避免使用。 Javascript 的 eval 函數可以在當前作用域執行一段包含 Javascript 代碼的字符串。 var foo = 1; function test() { var fo...
摘要:當間隔時間設置較小時,將會導致回調函數堆積。處理可能阻塞的代碼最簡單且最可控的方式就是在回調函數內部使用函數。但是很明顯,由于指定最大值的限制,還會有定時器沒有被清除掉。另外,盡量避免使用函數,從而避免可能導致的回調函數堆積現象。 由于 Javascript 是異步的,因此我們可以通過 setTimeout 和 setInterval 函數來指定特定時間執行代碼。 function ...
摘要:最近在清理的未讀列表,看到了才知道了的,一種自動插入分號的機制。這種行為被叫做自動插入分號,簡稱。不過在省略分號的風格中,這種解析特性會導致一些意外情況。規則標準定義的包括三條規則和兩條例外。規則一情況三就是為量身定做的。 TL;DR 最近在清理 Pocket 的未讀列表,看到了 An Open Letter to JavaScript Leaders Regarding Semico...
摘要:本文同步自我的博客園關于這個問題,網上已經有很多人討論過了,我先說說自己對這個問題的回答加但非必須有些人寫代碼,懶得加分號,除非是迫不得已才勉強放一個分號上去。 本文同步自我的博客園:http://hustskyking.cnblogs.com 關于這個問題,網上已經有很多人討論過了,我先說說自己對這個問題的回答:加!(但非必須) 有些人寫代碼,懶得加分號,除非是迫不得已才勉強放一...
閱讀 2625·2021-09-28 09:35
閱讀 3270·2021-09-03 10:28
閱讀 2922·2019-08-30 15:43
閱讀 1487·2019-08-30 14:04
閱讀 1819·2019-08-29 17:02
閱讀 1825·2019-08-26 13:59
閱讀 703·2019-08-26 11:51
閱讀 3269·2019-08-23 17:16