10

このアプローチは常に使用されています。

(function (window) {
    var document = window.document,
        location = window.location,
        navigator = window.navigator;
})(window)

window上記のスニペットを調べていると、グローバルにアクセス可能なオブジェクトが引数として関数に渡されるのはなぜだろうかと思います。それはそれでしょうか:

  1. 開発者は、ローカル関数スコープ内からウィンドウにアクセスできることを 100% 確実に知ることができませんか?
  2. コードを読む他の開発者に意図を明確にするため、これは良い習慣です。
  3. ジョン・レシグがやってるのを見たことがあるでしょうから、指を舐めるのが上手いに違いありません!

どう思いますか?

4

3 に答える 3

4

これにより、コードの移植性が向上します。

コードをコピーして、グローバル ウィンドウ オブジェクトが定義されていない環境 (ノードなど) に貼り付けることができますが、コード内で関心のあるすべてのことに対して API 互換性があります。次に、関数に渡される引数を変更するだけです。

コードをより明確にするわずかな変更:

(function(root){
    var document = root.document,
        location = root.location,
        navigator = root.navigator;
})(window)
于 2012-08-15T00:24:49.220 に答える
2

あなたが尋ねたコードのいくつかの考えられる理由を知っています:

  1. documentlocationおよびのショートカットをnavigatorローカル変数に作成すると、パフォーマンスがわずかに向上し、入力が減る可能性があります。

  2. window自己実行関数に渡すと、への参照windowがグローバル空間から使用するよりもわずかにパフォーマンスが向上する可能性があります。

  3. グローバルオブジェクトが呼び出されない(ブラウザではなく)javascriptの実行環境がいくつかあるwindowため、コードをより簡単にそれに適応させることができます。ただし、ブラウザ用に記述されたコードはいずれにしても他のブラウザ機能を使用する可能性が非常に高いため、この理由は実行可能であるとは思えません。

于 2012-08-15T00:24:59.367 に答える
0
(function ($) { }(jQuery)); // $ stands for jQuery within this function
(function (window) { }(window)); // window still equals window
(function (bananas) { }(document)); // all references to bananas => document. (silly)
  1. 通常、上部の名前は名前を付けたいものであり、下部の名前はそれが何を表しているかを保証します. したがって、先頭に $ があるということは、(この例では) すべての jQuery コードが jQuery のままであることを意味します。ウィンドウ/ウィンドウに使用すると、ウィンドウの他の定義が「ウィンドウ」としての元の意図を変更しないことが保証されます。
  2. これは間違いなくベスト プラクティスであり、匿名関数/名前空間内で必要なものを許可する制御された方法です。
  3. 理由の一つ!レシグは男です。
于 2012-08-15T00:45:43.530 に答える