2009-08-31 20 views
10

He estado usando $ .each para hacer iteraciones por un tiempo, pero sigo escuchando a la gente decir que usa JS nativo para hacer bucles. Estoy muy preocupado por el rendimiento, pero no estoy seguro de si siempre es posible reemplazar $ .each with for de una manera significativa.Reemplazando jQuery cada uno por

Así que mis preguntas son, ¿es posible reemplazar siempre $ .each por, y si no, cuál es la regla general de cuándo se puede hacer y cuándo no?

tengo una cada de esta manera:

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

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

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

}); 

Respuesta

9

Esto es lo que jQuery hace con .each, básicamente:

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

Así que no es difícil sustituir los 'contenidos' de su función anónima con la llamada callback.call. Solo asegúrese de reemplazar this con un objeto temporal jQuery.

La conversión de su código suministrado:

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

Para la velocidad adicional (potencial), caché foo[i] en un temporal. también, y asigne $thisparent solo cuando sea necesario. Si condition y condition2 son mutuamente excluyentes, use un solo if (condition || condition2).

+0

Muchas gracias, pero ¿pueden darnos un ejemplo? Gracias. – Mark

+0

Muchas gracias, :) excelente respuesta y gracias por aumentar mi comprensión. ¿Puedes demostrar cómo usar un solo si? Además, ¿qué sucede si tengo media docena de condiciones mutuamente excluyentes? – Mark

+0

@Mark, lee en el || operador (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators). – strager

5
+0

Parece que solo se obtiene un rendimiento sustancial con arreglos grandes. Bueno saber. – Joel

+1

Creo que la razón detrás de esto es la sobrecarga de las llamadas a funciones, ya que el código 'each' de jQuery no es tan pesado en absoluto. – strager

+2

¿Qué pasa con esto: http://www.youtube.com/watch?v=mHtdZgou0qU#t=24m00s – Mark

Cuestiones relacionadas