簡単な説明
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クロージャはどのように機能しますか?この質問はクロージャについてあまり深い知識を必要としないはずですが、クロージャを理解するのに問題がある場合は、多くの有用な答えがあります。:)