2009-08-31 28 views
10
に置き換えます

私は$ .eachを使ってしばらくの間繰り返していましたが、ネイティブJSを使ってループを行うと言うことを聞いています。私はパフォーマンスについて非常に心配していますが、$ .eachを意味のある方法で置き換えることが常に可能かどうかはわかりません。それぞれjQueryを

私の質問は、いつでも$ .eachをforと置き換えることが可能であるかどうかであり、そうでない場合は、実行可能な場合とできない場合の経験則です。私はこのような各いる

$this.find("div.class").each(function(){ 
    var $thisparent = $(this).parent(); 

    if (condition) {   
    $(this).prepend($thisparent.text()); 
    } 

    if (condition2) {   
    $(this).prepend($thisparent.text()); 
    } 

}); 

答えて

9

これは、jQueryの.eachで何をするかで、基本的に

$.fn.each = function(callback) { 
    var i, length = this.length; 
    for(i = 0; i < length; ++i) { 
     callback.call(this[i]); 
    } 
}; 

したがって、匿名関数の 'contents'をcallback.call呼び出しで置き換えることは難しくありません。 thisを一時的にjQueryオブジェクトに置き換えてください。追加の(潜在的な)速度のため

var foo = $this.find("div.class"), 
    fooLength = foo.length, 
    i, 
    $thisparent; 

for (i = 0; i < fooLength; ++i) { 
    $thisparent = $(foo[i]).parent(); 

    if (condition) {   
     $(foo[i]).prepend($thisparent.text()); 
    } 

    if (condition2) {   
     $(foo[i]).prepend($thisparent.text()); 
    } 
} 

、一時的にキャッシュfoo[i]:あなたの供給コードを変換する

。必要なときにのみ$thisparentを割り当ててください。 conditioncondition2が互いに排他的な場合は、if (condition || condition2)を単独で使用してください。

+0

ありがとうございますが、例を挙げてください。 ありがとうございます。 – Mark

+0

ありがとう、:)私の理解を高めるために素晴らしい答えとありがとう。あなたは単一のifを使う方法を実証できますか?また、もし私が6つの相互に排他的な条件を持っていたらどうなりますか? – Mark

+0

@マーク、||オペレータ(https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators)。 – strager

5

誰かがfor$.eachのパフォーマンスを比較した:

http://jquery-howto.blogspot.com/2009/06/javascript-for-loop-vs-jquery-each.html

+0

大きな配列では、パフォーマンスが大幅に低下します。知っておいてよかった。 – Joel

+1

jQueryの 'each'コードはそれほど重くはないので、これの背後にある理由は関数呼び出しのオーバーヘッドだと思います。 – strager

+2

それでは、どうすればいいのですか: http://www.youtube.com/watch?v=mHtdZgou0qU#t=24m00s – Mark

関連する問題