同じ関数内で$(this)
が複数回呼び出されると、後続の呼び出しで jQuery オブジェクトを構築するための追加のオーバーヘッドが発生しますか? つまり、$(this)
最初に呼び出されたときにキャッシュされますか? そうでない場合は、変数に格納$(this)
し、後で必要になったときにその変数を使用することをお勧めし$(this)
ますか?
5 に答える
$()
jQueryコンストラクタ関数です。
this
呼び出しの DOM 要素への参照です。
基本的に、 inでは、 inをパラメーターとして$(this)
渡すだけで、 jQuery メソッドと関数を呼び出すことができます。this
$()
http://www.learningjquery.com/2007/08/what-is-this
良い数字: http://jsperf.com/jquery-this-vs-this-vs-chain/2
通常はvar $this = $(this);
、新しい jQuery オブジェクトを必要以上に頻繁に作成しないようにするために使用します。以下のコードの場合、2 つまたは 4 つのオブジェクトではなく、1 つのオブジェクトのみを作成します。連鎖可能性とはまったく関係ありません。
this
javascript では (通常) 現在の関数を呼び出したオブジェクトへの参照を表します。
一般に、ローカル変数に格納する目的は$(this)
、jQuery 関数を$()
複数回呼び出さないようにすることです。jQueryized をキャッシュするthis
と、複数回使用する必要がある場合に効率が向上します。
$
は単に有効な変数名文字であり、変数名の最初の文字として使用され、通常は、それが既に jQuery オブジェクトであること (および関連するメソッド/プロパティが利用可能であること) をプログラマーにキューに入れます。
この構造が頻繁に使用されているのを見てきました。
var someFunc = function () {
var that = $(this);
// you could also cache like var $this = $(this);
// do stuff here...
};
呼び出すたびに$()
、呼び出しを行う際に多少のオーバーヘッドが発生しますが、それほど多くはありません。キャッシュしなければ目立たないと思います$(this)
。$(this) の jquery キャッシュの SO エントリを参照してください
式が評価されるたび$(this)
に、jQuery ファクトリ関数が呼び出され、新しいjQuery インスタンスが作成されます。ただし、このプロセスによるパフォーマンスの低下は無視できます。数マイクロ秒 (100 万分の 1 秒) しかかからないと計算したことがあります。
$(this)
個人的には、関数本体内で複数回使用することを心配していません。jQuery インスタンス ( var $this = $(this);
) のキャッシュはオプションですが、私はしません。(私はたまたま に$this
比べて名前が醜い$( this )
と思います。ほとんどの人がここで私に同意しないことを理解しています。)
$:
var start = (new Date).getTime();
for(var i=0; i<1000000; i++)
{
var testClass = $("#testDiv").attr("class");
}
var end = (new Date).getTime();
alert(end-start);
ここで行っているのは、コードを 1,000,000 回実行して、ページ上の jQuery オブジェクトのクラスを変数に格納するのにかかる時間を確認することだけです。約 4.286 秒かかりました。次に、既に保存されているオブジェクトを参照するように変更しました。
var start = (new Date).getTime();
var testDiv = $("#testDiv");
for(var i=0; i<1000000; i++)
{
var testClass = testDiv.attr("class");
}
var end = (new Date).getTime();
alert(end-start);
これには 1.254 秒しかかかりませんでした。これはまさにあなたが求めているものではありませんが、jQuery オブジェクトを生成するプロセスは、既に生成されたオブジェクトから何かを参照するよりも時間がかかることを強調しています。
とはいえ、ほとんどのアプリケーションでは、その違いはおそらく無視できるでしょう。
$(this) が呼び出されるときは、既にインスタンス化されたオブジェクト内から呼び出す必要があります。$(this) はそのオブジェクトへの単なる参照であるため、オーバーヘッドは最小限に抑える必要があります。
間違っているかもしれませんが、もしそうなら訂正してください。