8

最近、私は他の誰かのコードを読んでいて、これに出くわしました:

// Semicolon (;) to ensure closing of earlier scripting
// Encapsulation
// $ is assigned to jQuery
;(function($) {

     // DOM Ready
    $(function() {
        ...
  });

})(jQuery);

先頭の;のポイントを理解し、$(function(){はドキュメントの準備ができているのと同じですが、function($)を追加するポイントは何ですか?

閉鎖だとは思いますが、これは常にグローバルスコープで呼び出されているので、気にする必要はないようです。$(function(){は、どちらの方法でも同じグローバルオブジェクトを使用します。

それは何かから保護するためですか、それとも別の理由でベストプラクティスですか?

4

2 に答える 2

13

これは、jQueryプラグインの一般的な構造です。$識別子が上書きされて他の目的で使用されるのを防ぎます。匿名関数内で$は、常にjQueryを参照します。

例:

$ = "oh no";
$(function() { //Big problem!
    //DOM ready
});

新しいスコープを導入することで、$それが期待するものを参照していることを確認できます。

$ = "oh no";
(function($) { //New scope, $ is redeclared and jQuery is assigned to it

    $(function() { //No problem!
        //DOM ready
    }); 

}(jQuery));

この背後にある主な理由は、他の多くのJavaScriptライブラリ$が識別子として使用していることです(例:PrototypeJS)。PrototypeとjQueryの両方を使用する場合は、Prototypeにその識別子を持たせる必要がありますが、jQueryメソッドを呼び出すたび$に書き出す必要はないでしょう。jQuery新しいスコープを導入することで、jQueryがその$実行コンテキストに戻ることができるようになります。

于 2012-10-12T14:36:00.150 に答える
1

提供したコードサンプルは、自己呼び出し関数の例です。

(function(){
 // some code…
})();

括弧の最初のセットは関数を定義します:(括弧で囲まれた無名関数)

(function() {})

これは無名関数を定義します。それ自体では何もしません。ただし、定義の後に括弧のセットを追加する()と、関数の呼び出しに使用される括弧と同じになります。これを試してみてください:

(function(message) {
  alert(message);
})("Hello World");

これにより、パラメーターを受け入れる関数が作成され、指定された値を含むアラートボックスが表示されます。次に、「HelloWorld」のパラメーターを使用してその関数をすぐに呼び出します。


あなたの例では、自己呼び出し関数が定義されています。。という名前のパラメーターを受け入れます$jQuery次に、引数として渡されることを参照して、関数がすぐに呼び出されます。

これは、jQueryをモードで動作させる場合に一般的ですnoConflict()(これにより、へのグローバル参照が削除されます$)。

モードではnoConflict()、グローバル変数を介してjQueryにアクセスできますjQueryが、ほとんどの人はむしろを使用する$ため、この自己呼び出し関数は、関数のスコープでjQuery指定されたパラメーターとしてグローバル変数を受け入れます。これにより、内でショートカットを自由に使用できます。グローバルスコープで使用する他のライブラリとの衝突を回避するために、jQueryをnoConflict()モードで動作させている間の自己呼び出し関数。$$$

これがあなたの質問に答えることを願っています!

于 2012-10-12T14:47:28.120 に答える