JavaScript自動插入分號

來源:互聯網
上載者:User

自動分號插入
儘管 JavaScript 有 C 的代碼風格,但是它不強制要求在代碼中使用分號,實際上可以省略它們。
JavaScript 不是一個沒有分號的語言,恰恰相反上它需要分號來就解析原始碼。
因此 JavaScript 解析器在遇到由於缺少分號導致的解析錯誤時,會自動在原始碼中插入分號。
var foo = function() {
} // 解析錯誤,分號丟失
test()
自動插入分號,解析器重新解析。
var foo = function() {
}; // 沒有錯誤,解析繼續
test()
自動的分號插入被認為是 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) {

        // 沒有插入分號,兩行被合并為一行
        log('testing!')(options.list []).forEach(function(i) {

        }); // <- 插入分號

        options.value.test(
            'long string to pass here',
            'and another long string to pass'
        ); // <- 插入分號

        return; // <- 插入分號, 改變了 return 運算式的行為
        { // 作為一個程式碼片段處理
            foo: function() {}
        }; // <- 插入分號
    }
    window.test = test; // <- 插入分號
// 兩行又被合并了
})(window)(function(window) {
    window.someLibrary = {}; // <- 插入分號
})(window); //<- 插入分號
    注意: JavaScript 不能正確的處理 return 運算式緊跟分行符號的情況,
    雖然這不能算是自動分號插入的錯誤,但這確實是一種不希望的副作用。
解析器顯著改變了上面代碼的行為,在另外一些情況下也會做出錯誤的處理。
前置括弧
在前置括弧的情況下,解析器不會自動插入分號。
log('testing!')
(options.list []).forEach(function(i) {})
上面代碼被解析器轉換為一行。
log('testing!')(options.list []).forEach(function(i) {})
log 函數的執行結果極大可能不是函數;這種情況下就會出現 TypeError 的錯誤,詳細錯誤資訊可能是 undefined is not a function。
結論
建議絕對不要省略分號,同時也提倡將花括弧和相應的運算式放在一行,
對於只有一行代碼的 if 或者 else 運算式,也不應該省略花括弧。
這些良好的編程習慣不僅可以提到代碼的一致性,而且可以防止解析器改變程式碼為的錯誤處理。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。