5

次のようなループがあります。

$('#SomeSelectorID').find('.SomeElementsByClassName').each(function () {

    $(this).some code here;
    $(this).some other code there;
    $(this).some other code here and there;
});

ループの先頭に書いてvar TheThis = $(this);から置き換える$(this)TheThis、それはパフォーマンスの最適化でしょうか?

4

5 に答える 5

3

はい、パフォーマンスのペナルティがあります。$(this) を使用すると、保存されたバージョンを使用するよりも遅いことを示す小さなデモを作成しました。

JSFiddle のデモはこちら

いいえ、コードを変更する必要はないと思います。この場合の利点は非常に小さいため、ほとんど違いに気付かないでしょう。ゲームやデータ処理アプリを開発している別の状況では、それが問題になる可能性があります。

これが私のテストの結果です...

Testing jquery version...
1000000 iterations $(this): 0.006849ms
Testing non-jquery version...
1000000 iterations of this$: 0.001356ms
于 2013-01-29T21:04:32.250 に答える
2

もちろん、これはパフォーマンスの最適化です。価値があるかどうか、それが本当の問題です。DOM を繰り返し使用している場合は、間違いなく価値があります。この場合、jQuery でオブジェクトをラップするだけなので、フットプリントははるかに小さくなります。

そうは言っても、パフォーマンスは少し向上しますが、読みやすさ、保守性、またはパフォーマンスを向上させるために通常犠牲にしなければならないその他の点で失うものは何もないため、微調整を行うこともできます。

于 2013-01-29T20:49:35.480 に答える
1

これをテストすると、少なくとも Chrome ではパフォーマンスへの影響はありません。

var start = new Date().getTime(),
    iterations = 50000;

$('#foo').find('.bar').each(function () {

    var that = $(this);

    for(var i = 0; i < iterations; i++)
      that.find('i');

});

console.log(new Date().getTime() - start);

使用$(this)結果は多かれ少なかれ同じです。

http://jsfiddle.net/BuREW/

于 2013-01-29T21:04:18.410 に答える