2011-10-27 8 views
6

jQueryのソースは、このように、閉鎖に包まれている。これらのパラメータのいずれかが必要な理由を私は理解していないなぜこれらの2つのパラメータがjQueryソースにありますか?

(function(window, undefined) { 
    //awesome jQuery library code in here 
})(window); 

windowはグローバル変数ですから、なぜそれを渡す必要がありますか?グローバルパラメータを渡し、同じ名前のクロージャ内でそのパラメータにアクセスする目的は何ですか?

undefinedとは何ですか?なぜ値が渡されないのですか?

+0

ウィンドウはこのスコープでローカルとして使用されるため、アクセスが高速になります。 – Ibu

答えて

11

私はこれが既に回答されていますが、かなり確信している:a)はすなわち、匿名内の単一文字の変数名とそれを置き換える(コード圧縮は名前をのmungeすることができますwindow

  • パッシング関数)を呼び出し、b)ライブラリが定義された時点で変数がウィンドウオブジェクトを参照するようにします.jQueryがロードされた後にグローバルスコープ内でwindowを再定義する場合にのみ使用します。引数としてundefined(その値を渡していない)を含む

  • が変数いじるを可能とundefined変数が再定義されている場合の問題を回避、undefinedために同じことを(うん、Javascriptがこれを可能にします)。

私は両方のケースで、これは、それはインタプリタがグローバルスコープで見て前に検索します関数スコープで利用可能なグローバル変数、両方を作るように、変数への参照をスピードアップすることになっていると信じています。しかし、私は正直なところ、ここでのパフォーマンスの違いはかなり大きいと想像することはできません - 私は最大の問題は、変数名のmunging、それはよりコンパクトなコードのために縮小したと思う。

+0

は完全に意味があります。+1 – Ibu

+0

'window'がグローバルスコープで再定義された場合、それを渡すときにまだ修正されませんか? –

+2

@PeterOlson - 後で再定義されていない場合は、jQueryライブラリがロードされた時点で 'window'リファレンスが修正されます。そのため、後続の' window'は何の効果もありません。ライブラリがロードされる前にウィンドウを再定義すると、これは中断されますが、取得したものに値すると思います:) – nrabinowitz

関連する問題