2

私はjQueryを学んでおり、次のコード構造を理解しようとしています。

if(jQuery) (function($){
    $.extend($.fn, {
        MyPlugin: function(a, b) {
        ....        
        }
    });
})(jQuery);

私の知る限り、これは最初にjQueryオブジェクトが存在するかどうかを確認します。含まれている場合は、「fn」属性を使用してjQueryオブジェクトを拡張するインライン関数を定義します。

この質問が他のいくつかの場所、たとえばここで尋ねられるのを見たことがありますが、私が理解していない点は対処されていません。混乱しているところ...

-特別なjquery"$"オブジェクトが初期関数に渡されるのはなぜですか?

-インライン関数がjQueryオブジェクト(最後の行)に渡されるのはなぜですか?すなわち:(function($){...})(jQuery);

ありがとう。

4

4 に答える 4

5

簡単な説明

noConflictモードjQueryであって$も、で参照できるクロージャを作成するだけです。

jSangの回答(+1)のプラグインオーサリングでも説明されています。

技術的には、呼び出された1つの引数を受け取り、すぐにそれを唯一の引数として$渡す匿名関数を定義するだけなので、この関数のスコープ内へのエイリアスとして機能します-グローバルスコープ内のは、このクロージャー内ではアクセスできないことに注意してください。jQuery$jQuery$

つまり、グローバルスコープでPrototypeを使用している場合、 jQueryを参照するローカルスコープが優先されるため、クロージャ内$を使用してPrototypeにアクセスすることはできません。$$

もちろん、クロージャ内に別のライブラリのメソッドが必要な場合は、2つの引数を使用して定義できます。そして、別のライブラリが名前空間を使用していると仮定し(function($j, $p) {て、パスを呼び出します。または、もっと簡単に言えば、クロージャのローカルスコープ変数を他のライブラリのグローバルスコープ変数とは異なるものにエイリアスします。これは、関数のスコープ内でグローバルに引き続きアクセスできることを意味します。この後者の効果は、ドキュメントに明示的に記述しない限り、ユーザーが何に割り当てられているかを完全に確認できないため、望ましくない場合があることに注意してください。複数のライブラリを必要とするプラグインは少し話題から外れていると思いますので、そのままにしておきましょう。(jQuery, $)$(function($j) {$$


もう少し詳細

noConflictドキュメントページからの実用的なクロージャの例:

jQuery.noConflict();
(function($) { 
  $(function() {
    // more code using $ as alias to jQuery
  });
})(jQuery);

そのクロージャエイリアスjQuery$スコープ内にあり、たとえば、ユーザー$がPrototypeまたはグローバル名前空間を使用する別のライブラリを持っている場合に非常に役立ちます。これにより、プラグインがはるかに堅牢になり、エラーが発生しにくくなります。

クロージャーは、jQueryが$変数を制御できるかどうかに関係なく使用できるため、プラグインのオーサリングに最適です。

エンドユーザーの1人がnoConflictモードのjQueryと名前空間を使用するプロトタイプを持っていて、プラグインがjQueryメソッド$で拡張しようとした場合を想像してみてください。$カオスとポニー!

もちろん、クロージャーをスキップしてすべて$jQueryに置き換えることもできますが、コードが長くなり、多くの開発者にとって読みにくくなります。

また、JavaScriptクロージャはどのように機能しますか?この質問はクロージャについてあまり深い知識を必要としないはずですが、クロージャを理解するのに問題がある場合は、多くの有用な答えがあります。:)

于 2012-07-20T03:58:41.050 に答える
4

私はこれらの質問に答えるために最善を尽くします。私はiPadを使用しているので、技術的な詳細を省略した場合は、我慢してください。これらのポイントは少し単純化されていますが、何が起こっているのかを説明するのに役立ちます:)

  • $は、別の意味でオーバーライドされる可能性があるため、渡されています。jQueryはnoCinflictモードにすることもできます。
  • (jQuery)が行っているのは、定義されたインライン関数をすぐに呼び出すことです。これは、自己実行関数として知られています。正しくはありませんが(それ自体は実行されませんが、実行します)、それが知られるようになりました。jQueryを関数に渡すので、$の値があります。別の回答で言及されているように、これは閉鎖を生み出します。「JavaScriptクロージャ」をグーグルで検索することをお勧めします。あなたはいくつかの非常に貴重な情報を見つけるでしょう:)

お役に立てば幸いです:)

于 2012-07-20T04:01:36.180 に答える
3

これはあなたの質問に答えます:http: //docs.jquery.com/Plugins/Authoring

于 2012-07-20T03:56:29.487 に答える
3

あなたが探しているのは、新しいプラグイン「$.fnを拡張している部分」でjQueryを拡張することです。そしてそれは閉鎖ブロックに包まれています。

(function($){
//do sth
})(jQuery);

上記のコードはあなたが考慮しなければならない部分です。それを説明するには、以下の例を参照してください。

1.関数を宣言して呼び出す

var fn = function(b){ /*do sth like alert(b)*/ };
fn('hiiii');

2.短い構文は

(function(b){ /*do sth like alert(b)*/ })('hiiii');

ここで、b$に置き換え、パラメーター'hiiii'jQueryに渡すと、次のようになります。

(function($){ /*do sth with $*/ })(jQuery);

最初の例でわかるように、bはメソッドパラメーターであり、「hiiii」は呼び出し時にパラメーターを渡されます。上記と同じように、$はメソッドパラメーターであり、jQueryは呼び出し時に渡されるパラメーターです。

$はほとんどすべてのJSライブラリで広く使用されているため、他のライブラリとの競合を避けるためです。したがって、他のライブラリでjQueryを使用できます。

プラグインの開発方法について詳しく知りたい場合は、この投稿にアクセスしてください

于 2012-07-20T04:26:58.980 に答える