13

デバッグ モードでは、多くの個別の JavaScript ファイルに記述されているアプリケーションがありますが、ページのヘッド ブロックの一部として同期的に読み込まれます。リリースでは、これらのファイルをすべてマージして縮小します。今日、縮小版でエラーを見つけ続けたので、マージされたファイルを 1 つロードして問題をデバッグしたところ、1 つのライブラリが関数を自己実行しており、定義されている他の関数windowが実行されていることがわかりました。

ここでは、一般的なオブジェクトを使用して動作をレポしました。ウィンドウであるかどうかは関係ありません。

<head>
    <script>
        var a = {}

        a.X = function x(){
            console.log("shouldn't be executed");
        }

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>

この例では、次の出力を取得します

self execution 
shouldn't be executed 

呼び出しを変更すると

<head>
    <script>
        var a = {}

        function x(){
            console.log("shouldn't be executed");
        }

        a.X = x;

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>

それから私はただ得る

self execution

これは私が期待したものです。最初の例で、 が自己実行関数に渡されたXときに呼び出されるのはなぜですか?a

4

3 に答える 3

22

;関数を に割り当てた後、がありませんa.X

セミコロンの挿入はトリガーされません。

無名関数の前後の()は前の関数を呼び出すために使用され、その戻り値は に代入されXます。

つまり、あなたが持っているものは次のものと同等です:

var a = {};

a.X = (function x(){
    console.log("shouldn't be executed");
}(
    (function(a){
        console.log("self execution");
    }(a))
));

ちなみに、この問題はJS Lintにとって良い宣伝であり、それを取り上げたはずです。

于 2013-08-22T19:51:35.360 に答える
3

セミコロンを挿入すると期待どおりに動作するため、セミコロンの挿入と関係があります。

    var a = {}

    a.X = function x(){
        console.log("shouldn't be executed");
    }; // added semicolon

    (function(a){
        console.log("self execution");
    }(a));
于 2013-08-22T19:52:06.007 に答える
1

;の後にセミコロンがありませんa.X = function x() { ...} ;

すなわち

a.X = function x(){
   console.log("shouldn't be executed");
};
于 2013-08-22T19:52:59.643 に答える