细说 Javascript 拾遗篇(三) : 自动插进去分号

只管 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

    原文作者:StephenLee
    原文地址: https://segmentfault.com/a/1190000000514868
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞