38

jQuery のベスト プラクティスについて調査していたところ、Greg Franko によるこの記事を見つけました。

通常、私は:

$("document").ready(function() {
    // The DOM is ready!
    // The rest of the code goes here
});

ただし、この記事では次の使用を推奨しています。

// IIFE - Immediately Invoked Function Expression
(function($, window, document) {

    // The $ is now locally scoped 

    // Listen for the jQuery ready event on the document
    $(function() {

        // The DOM is ready!

    });

    // The rest of the code goes here!

}(window.jQuery, window, document));
// The global jQuery object is passed as a parameter

そこにコメントを見ることができますが、正確に何を言っているのかわかりませんでした。

では、どちらがより良いアプローチであり、その理由は何ですか?

両方の方法が機能することはわかっていますが、2 番目の方法がどのように優れているのでしょうか。

4

9 に答える 9

50

即時呼び出し関数式 (IIFE)

IIFE は、グローバル変数/プロパティをローカルにスコープし、JavaScript コードベースを外部の干渉 (サードパーティ ライブラリなど) から保護するための理想的なソリューションです。多くの異なる環境 (jQuery プラグインなど) で実行される jQuery コードを作成している場合は、IIFE を使用して jQuery をローカルにスコープすることが重要です。これを行う方法は次のとおりです。

   // IIFE - Immediately Invoked Function Expression
  (function($, window, document) {
      // The $ is now locally scoped

      // The rest of your code goes here!

  }(window.jQuery, window, document));
  // The global jQuery object is passed as a parameter

ソース ファイルの一番下までスクロールして、IIFE に渡すグローバル変数/プロパティを確認する必要がない場合は、次のようにします。

   // IIFE - Immediately Invoked Function Expression
  (function(yourcode) {

      // The global jQuery object is passed as a parameter
      yourcode(window.jQuery, window, document);

      }(function($, window, document) {

          // The rest of your code goes here!

      }
  ));

IIFE の詳細については、私のブログ記事I Love My IIFE をご覧ください

jQuery Ready イベント

多くの開発者は、次のようにすべてのコードを jQuery Ready イベント内にラップします。

   $("document").ready(function() {
      // The DOM is ready!
      // The rest of your code goes here!
  });

または、次のような短いバージョン:

   $(function() {
      // The DOM is ready!
      // The rest of your code goes here!
  });

上記のパターンのいずれかを実行している場合は、DOM に依存しないアプリケーションの一部 (メソッドなど) を Ready イベント ハンドラーの外に移動することを検討する必要があります。このような:

   // IIFE - Immediately Invoked Function Expression
  (function(yourcode) {

      // The global jQuery object is passed as a parameter
      yourcode(window.jQuery, window, document);

      }(function($, window, document) {

          // The $ is now locally scoped 
          $(function() {

              // The DOM is ready!

          });

          // The rest of your code goes here!

      }
  ));

このパターンを使用すると、1 つのイベント ハンドラー コールバック関数内にすべてをラップする必要がないため、(コード設計の観点から)ロジックを簡単に分離できます。すべてをすぐに初期化する必要がないため、アプリケーションのページ読み込みパフォーマンスも向上します。この好例は、DOM の準備が整ったときにバインドする必要のないDOM イベント ハンドラーの遅延バインドです。

私の jQuery ベスト プラクティス ブログ投稿から引用: http://gregfranko.com/blog/jquery-best-practices/

于 2013-08-19T13:45:38.070 に答える
16

あなたのコードと「推奨される」アプローチの唯一の違いは、互換性とおそらくより良い圧縮です。速度差はありません。

window.jQueryIIFE (即時に呼び出される関数式) に最初の引数として渡し$、IIFE 内で名前を付けると、 global に自分自身を割り当てる他のライブラリに干渉することなく jQuery を使用できるようになります$。global に自分自身を割り当てる他のライブラリを使用しない場合$、IIFE の最初の引数は何の役にも立ちません。

windowanddocumentを IIFE に渡すと、JS ミニファイアーがコードを次のような (空白なしで) 変換できるようになり、圧縮率がわずかに向上します。

(function(a, b, c) {
    a(c).ready(function() {
        // ...
    });
})(window.jQuery, window, document);

windowあなたが広範囲に使用しない限りdocument、私はただやります:

;(function($) {
    $(function() {
        ...
    });
})(jQuery);
于 2013-08-19T06:07:19.637 に答える
5
  1. $(function(){})と同等$('document').ready(function(){});です。どちらを使用するかはあなた次第ですが、後者は 2 つのうち古い方であり、起動するのがより冗長です。

  2. リストした2番目のアプローチは、グローバル変数を防止する明示的な試みであり、既知のグローバル、、、およびを注入$windowますdocument。これは、グローバルがいかに簡単に導入されるかという認識を高め、ページに注入するコードについて可能な限り「クリーンルーム」にするために推奨されます。また、示されているコメントに従う場合、2 番目のアプローチは最初のアプローチと同等ではないことに注意してください。$ が引数として挿入されるため、このコードは $ 記号を所有することを希望する他のライブラリと互換性があります。

特に、// The rest of the code goes hereドキュメントの準備が整う前、またはそのイベントが発生したときに実行される可能性がある場所にあります。$に渡す関数の中に入れてください。

于 2013-08-19T05:53:13.497 に答える
3

$ を jQuery のエイリアスとして使用すると、

   $(document).ready(function(){})

と同じです

  (function($, window, document) {

  // The $ is now locally scoped 

 // Listen for the jQuery ready event on the document
  $(function() {

    // The DOM is ready!

  });

  // The rest of the code goes here!

 }(window.jQuery, window, document));

以前の回答で指摘したように、2 番目の方法は、jQuery オブジェクトをすぐに呼び出される関数式に渡すため、jQuery に $ エイリアスを自由に使用することを防ぎます。これにより、基本的に変数とその中のコードがプライベートに保たれ、グローバル オブジェクトが汚染されません。名前空間。

つまり、最初の方法に頼って $ を使用して他のライブラリを使用すると、競合が発生します。

于 2013-08-19T06:06:25.483 に答える
1

古い jQuery バージョン (私の記憶が正しければ - 1.8.X より前) で作業する必要があるまれな状況では、2 つの document.ready ブロックを指定すると、IE9 で最初のブロックのみが起動されます。

これは私が 1 回か 2 回経験したまれなバグであり、再現することはできませんが、注意する価値があると思いました。

于 2013-08-19T08:32:45.617 に答える
0

jqueryを使用してドキュメント準備完了イベントを使用できます。ドキュメントが完全にロードされたときにイベントが発生します。

 $(function () {
    setTimeout(function () {
        // your code
    }, 0);
})
于 2016-05-06T05:42:03.737 に答える
0

Jquery ドキュメントに基づく:

All three of the following syntaxes are equivalent:

$(document).ready(handler)
$().ready(handler) (this is not recommended)
$(handler)

http://api.jquery.com/ready/

于 2013-08-19T05:53:13.303 に答える
0

これはself ivokingorimmediately invoked関数と呼ばれます。これは、括弧の最後のセット内のパラメーターを使用して関数が作成されるとすぐに関数が実行されることを意味します。

Javascript Self Invoking FunctionsImmediate-Invoked Function Expression (IIFE)を読むと、これらの関数をどこでどのように使用するかが明確になります

于 2013-08-19T06:18:17.527 に答える