2009-08-31 13 views
10

Uso $ .each per fare iterazioni da un po 'di tempo, ma continuo a sentire le persone dire di usare il JS nativo per fare loop. Sono molto preoccupato per le prestazioni, ma non sono sicuro che sia sempre possibile sostituire $ .each con per in modo significativo.Sostituzione di jQuery ciascuna con

Quindi le mie domande sono, è sempre possibile sostituire $ .each con per, e se non qual è la regola per quando può essere fatto e quando non può.

Ho una ciascuna in questo modo:

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

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

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

}); 

risposta

9

Questo è ciò che jQuery fa con .each, fondamentalmente:

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

Quindi non è difficile sostituire i "contenuti" della funzione anonima con la chiamata callback.call. Basta essere sicuri di sostituire this con un temporaneo con l'oggetto jQuery.

Convertire la vostra codice fornito:

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()); 
    } 
} 

Per ulteriori (potenziale) di velocità, la cache foo[i] in una temporanea. anche, e assegnare $thisparent solo quando necessario. Se condition e condition2 si escludono a vicenda, utilizzare un singolo if (condition || condition2).

+0

Grazie mille, ma puoi fornire un esempio? Grazie. – Mark

+0

Grazie mille, :) ottima risposta e grazie per aver aumentato la mia comprensione. Puoi dimostrare come usare un singolo se? Inoltre, cosa succede se ho una mezza dozzina di condizioni che si escludono a vicenda. – Mark

+0

@Mark, Leggi su || operatore (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators). – strager

5

Qualcuno confrontato le prestazioni di for e $.each:

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

+0

Quindi, a quanto pare, si ottiene solo un notevole successo in termini di prestazioni con array di grandi dimensioni. Buono a sapersi. – Joel

+1

Penso che la ragione di questo sia il sovraccarico delle chiamate di funzione, dato che il codice 'each' di jQuery non è per nulla pesante. – strager

+2

Allora, per quanto riguarda questo: http://www.youtube.com/watch?v=mHtdZgou0qU#t=24m00s – Mark

Problemi correlati