リストした2つに加えて、3番目の選択肢があります。
1: $('#content .someclass')
2: $('.someclass', '#content')
3: $('#content').find('.someclass')
テストを実行しなくても言えることの 1 つは、#3 が #2 よりも高速であるということです。これは、内部で #2 が #3 になるためです。これを行うjQuery ソース コードを次に示します。これinit()
は、実際には jQuery コンストラクターである関数にあります。かなり長い一連のテストの後、呼び出しがあったことを検出し、代わりに呼び出しを$(selector,context)
行います。$(context).find(selector)
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor( context ).find( selector );
}
$(context).find(selector)
自分で呼び出して、余分なチェックを避けることができます。
したがって、#2 は決して最速のコードではありません。#3は常にそれを打ち負かします。
また、@KevinB が指摘しているように、#2 は/関数の文書化された使用法ではありません。これは、関数の文書化された使用法である #3 への単純な変換であり、コードは何年もの間このように機能しているため、ドキュメントの単なる見落としである可能性があります。$
jQuery
いずれにせよ、文書化されたケースであっても、#2 を使用する理由はほとんどありません。#3 の方が高速で理解しやすいためです。
#3 は #1 と比べてどうですか? ほとんどの場合はおそらく高速ですが、ブラウザーや特定のセレクターやページの複雑さによって異なる場合があります。ここでjsPerfはあなたの味方ですが、単に不自然なテストではなく、重要なページと同様のページを提供するようにしてください。
div.someclass
対についても同じこと.someclass
。テストして見てください。
に関して$(this)
は、その$
関数名は、通常の JavaScript 関数呼び出しである場合に、魔法のように見えることがあります。理解しやすいように、jQuery
代わりに関数名を使用してみてください。
jQuery(this)
ここで、これが実際に関数呼び出しであり、ある種の魔法の構文ではないことがより明確になるはずです。$(this)
orを使用する場合も同じです$(anything)
。常に関数呼び出しです。はい、繰り返し使用している場合は、結果を変数に保存することをお勧めします。
var $this = $(this);
私の唯一の提案は、変数に名前を付けないことです$thisobject
。余分なobject
言い回しは、実際には名前をより明確にするものではありません。simple$this
は、他の開発者にとってよりなじみ深いものになります。または、よりわかりやすい名前を使用することをお勧めします。
var $element = $(this);
一般に、this
と$this
は jQuery コードで過度に使用されているため、可能な限り短いがわかりやすい名前の通常の変数を使用することをお勧めします。
次の不自然な jQuery プラグインについて考えてみましょう。
jQuery.fn.log = function() {
this.each( function() {
console.log( this );
});
return this;
};
この短い関数では、this
意味が 2 回変わります。最初は jQuery オブジェクト、次にそのオブジェクトの個々の要素、そして再び jQuery オブジェクトです。人々が問題を抱えているのも不思議ではありませんthis
!
代わりに、名前付きパラメーターを使用して次のことを行うことができます.each()
。
$.fn.log = function() {
this.each( function( i, element ) {
console.log( element );
});
return this;
};
それははるかに混乱が少なくelement
、内部関数で jQuery オブジェクトが必要な場合は、次の場合と同じ方法で実行できますthis
。
var $element = $(element);