3

重複の可能性:
このJavaScript / JQuery構文はどのように機能しますか:(function(window、undefined){})(window)?

このパターンはjqueryソースコード(13行目)にあり、「window」と「undefined」をローカルに再バインドします。

(function(window, undefined) {
     window.something = 42;
     var dummy = 42 === undefined;
}(window));

'window'をローカルに再バインドすることは厳密なモードのことだと思います(ウィンドウへの偶発的なアクセスを防ぎます)-しかし、それらがundefinedローカルにどのようにバインドされているかも見てください。なぜ?

4

2 に答える 2

2

JavaScriptでは、次のように未定義に値を割り当てることができます。

undefined=42;

jQuery表記は、ブロック内で未定義が実際に未定義であることを保証します。

MDNによると

JavaScript 1.8.5以降、ECMAScript 5仕様に従って、undefinedは書き込み不可になります。

于 2012-12-21T22:51:16.957 に答える
1

誰かが誰かundefinedがあなたのコードの振る舞いを変更した場合、それは予測不可能になります:

 undefined = 42;

したがって、呼び出し中にその引数を渡さないことにより、関数を常に正しくするように強制undefinedします。

 function safe(undefined) {
   // undefined is really undefined here
 }

 function unsafe() {
   // undefined could be 42 here
 }

 undefined = 42;
 safe();
 unsafe();

と同様windowです。またwindow、渡すことで、実際のウィンドウに実際に影響を与えることなく関数をテストできるという追加の利点が得られます。つまり、「モック」ウィンドウsetTimeoutには、関数のタイミング動作をテストするカスタムを設定できます。

 function complex(window)
 {
    window.setTimeout(callback, 1000);
 } 

 var mockWindow = {setTimeout:...};
 complex(mockWindow);
 // here you can make sure setTimout was called and if necessary
 // call the callback.
于 2012-12-21T22:53:01.230 に答える