2013-08-27 3 views
7

は、それは次のように引数windowdocumentがあります次の2つのJavaScriptコードの違いは何ですか?即時機能を使用するいくつかのJavaScriptコードで

(function (window, document) { 
    ... 
})(window, document); 

しかし、windowdocumentはグローバルオブジェクトであり、直接、次のようにアクセスすることができます。

(function() { 
    var userAgent = window.navigator.userAgent; 
    ... 
    var el = document.getElementById(...) 
    ... 
})(); 

上記の2つのコードの違いは何ですか?どちらが良い方法で、なぜですか?私は考えることができる

+1

そうすることで、そのスコープ内の 'window'と' document'の実際の値を変更することができます。例えば物事はノードのために異なっています。 –

答えて

4

つの理由:

1)のアクセスは、グローバル()より高速なIがわずかに速いわけでよりも高速であるので、ローカル変数は、スコープチェーンの最初のものです。それらの名前がminimifiedできるよう

2)関数の内部では、windowdocumentは、ローカル変数は、以下のとおりです。

(function (w, d) { 
//var userAgent = w.navigator.userAgent; 

)(window, document); 
-1

差が多型である:最初のケースでは、あなたが関数にオブジェクトの任意のペアを渡すことができますwindowdocumentオブジェクトとして動作します(少なくともあなたの関数が呼び出すメソッドの場合)。その関数も関数で動作します。誰もがwindowdocumentはJavascriptによって定義されたwindowdocumentことを期待 - 実際に

は、特にこの二つのオブジェクトと、それはどんな利点ことを起こしやすい、よりエラーです。しかし理論的には、それが利益です。

+0

*「それはもっとエラーが起こりやすい」*なぜそうすべきか分かりません。私にとってもっと頑丈なようです: 'window'を持たない環境でスクリプトを実行すると、1行だけを変更することでスワップアウトできます。ダックタイピングは、動的に型付けされた言語の機能であり、弱点ではありません。 –

+0

'window'と' document'が 'window'と' document'となることを期待すれば、それらの変数で比較的大きな関数を持つと関数に素早くパッチを当てることでミスを招く可能性があります。彼らは定数ではありませんが、そのように行動することを期待しています。私は別の名前でそれらを呼び出す - それは私のポイントです。 – mgarciaisaia

4

上記2つのコードの違いは何ですか?どちらが良い方法で、なぜですか?

ブラウザーでのすべての実用性と用途には、大きな違いはありません。

つまり、グローバルではなくローカル変数を参照することによるパフォーマンスの向上はごくわずかです。

また、実際のwindowをモックバージョンで交換することができます。これは、テスト中や一部のオブジェクトが使用できないため、置き換えなければならない特定の環境で役立ちます。

Btw、別の種類の引数があります。これはundefinedです。このようにそれを行く:

(function(undefined) { 
    // your code 
}()); 

あなたが実際に外側の関数には何も渡さないと、そうすることによって、あなたはundefinedが改ざんされていないことを確認してください。私のような賢い人たちは、その目的のためにちょうどvoid 0でしょう:)

関連する問題