JavaScript Garden-自動セミコロン挿入


自動セミコロン挿入
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) {})

上のコードは解析器によって1行に変換されます.
log('testing!')(options.list || []).forEach(function(i) {})
log関数の実行結果は関数ではない可能性が高い.この場合、TypeErrorのエラーが発生し、詳細なエラー情報はundefined is not a functionである可能性があります.
結論
セミコロンは絶対に省略しないことをお勧めします.また、カッコと対応する式を1行に置くことも提唱しています.1行のコードしかないifまたはelse式についても、カッコを省略するべきではありません.これらの良好なプログラミング習慣は,コードの整合性に言及できるだけでなく,解析器がコード挙動を変える誤った処理を防止することができる.