なぜこれらの2つのパラメータがjQueryソースにありますか?

jQueryソースは次のようにクロージャーでラップされます。

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

私はこれらのパラメータのどちらかが必要な理由を理解していません。

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

未定義パラメータとは何ですか?なぜ値が渡されないのですか?

6
ウィンドウはこのスコープ内でローカルとして使用され、アクセスがより速くなります。
追加された 著者 Ibu,

1 答え

私はこれが既に答えられていると確信していますが、

  • window a)でコード圧縮を行うと、名前を変更することができます(つまり、無名関数内の一文字変数名に置き換えます)。 jQueryがロードされた後に誰かが window をグローバルスコープで再定義した場合のように、ライブラリが定義された時点でのwindowオブジェクトです。未定義を引数として(ただし値を渡さずに) undefined にも同様のことを行い、 undefined >未定義変数が再定義されています(これはJavascriptで許可されています)。

どちらの場合も、グローバル変数を関数スコープで使用できるようになるため、変数への参照が高速になるはずです。インタープリタはグローバルスコープを調べる前に検索します。しかし、私は正直なところ、ここでのパフォーマンスの違いはかなり大きいと想像することはできません - 私は最大の問題は、変数名のmunging、それはよりコンパクトなコードのために縮小したと思う。

11
追加された
window がグローバルスコープ内で再定義された場合、渡すときにそれでもまだredineされませんか?
追加された 著者 Peter Olson,
完全に意味がある、+1
追加された 著者 Ibu,
@PeterOlson私は、 "mungeへのコード圧縮"がその理由になると思います
追加された 著者 Ibu,
@PeterOlson - 後で再定義されない場合は、jQueryライブラリがロードされた時点で window の参照が修正されるので、後続の window ライブラリがロードされる前にウィンドウを再定義すると、これは中断されますが、取得したものに値すると思います:)
追加された 著者 nrabinowitz,
考えてみると、 undefined 変数も再定義することができるので、これも保護されます。答えを更新しました。
追加された 著者 nrabinowitz,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript