2010-12-15 23 views
15

He estado usando jQuery durante mucho tiempo y he estado escribiendo un plugin de diapositivas para mi trabajo y yo (no del 100% conscientemente) escribí probablemente el 75% en una sola cadena. Está completamente comentado y especifico cada end() y lo que está reiniciando, etc., pero ¿esto ralentiza jQuery o la carga DOM, o esto realmente lo acelera?¿Son malas las largas cadenas de jQuery?

+1

etiquetados este '[rendimiento]' así, ya que es el principal preocupación parece :) –

Respuesta

7

Depende de su código específico, como siempre. En cuanto a almacenar una referencia vs .end(), bueno ... con una cadena muy larga, es más rápido no encadenar vs .end() llamadas, simplemente porque tiene que manejar el equipaje adicional (almacenamiento/restauración), como la referencia .prevObject, la .selector, .context, etc. que probablemente no importa en muchos casos ... y solo más referencias entrelazadas a objetos anteriores.

Donde es más costoso es más difícil de medir ... no es la ejecución (aunque es más lenta, incluso si infinitesimalmente) ... es la recolección de basura más complicada para limpiar todos esos objetos más tarde, ya que el gráfico de dependencia ahora es mucho más grande.

Ahora ... ¿hará una diferencia de mensurable diferencia? no a menos que su cadena sea realmente larga, en cuyo caso es probablemente una micro-optimización de la que no necesita preocuparse en la mayoría de los casos.

99% de las veces, a menos que usted está haciendo que algunos llaman penalizar el rendimiento atroz, no se preocupe por lo, al igual que con la mayoría de los micro-optimizaciones. Si estás teniendo un problema con el rendimiento, entiéndelo.

+1

+1, para los buenos consejos sobre el uso de '.end()' –

+1

+1 Para el punto con respecto al tamaño del gráfico de dependencia. – Orbling

+0

Gracias! Bueno saber. Hago el almacenamiento en caché, etc., pero para esto no hay muchos selectores y el código simplemente fluía bien encadenado, así que lo hice, entonces pensé ... eh, oh ... esto podría ralentizar las cosas. –

2

Mi supongo que sería la diferencia, o más rápido, debido a la falta de intermediarios.

El único inconveniente importante es la claridad, si piensas mediante comentarios que es obvio sin hacerlo multilínea con variables intermedias, en virtud de los comentarios o simplemente una cadena de llamada bien limpia, entonces está bien.

6

Una de las cosas más caras que puede hacer en un navegador moderno es acceder y manipular el DOM. El encadenamiento le permite minimizar las búsquedas reales que tiene que hacer, lo que puede significar un código significativamente más rápido. La otra opción es hacer la búsqueda inicial, almacenar eso en una variable y hacer todo lo que esté fuera de esa variable. Dicho esto, jquery fue diseñado específicamente con esa api de encadenamiento en mente, por lo que es más idiomático encadenar.

4

Creo que la capacidad de recuperación de jQuery es una gran característica ... uno realmente debería usarla más a menudo. por ejemplo:

$(this) 
    .find('.funky') 
    .css('width', 30) 
    .attr('title', 'Funky Title') 
.end() 
.fadeIn(); 

es mucho mejor (y elegante) - no tienen que crear 2 jQuery $(this) objetos que:

$(this).find('.funky').css('width', 30).attr('title', 'Funky Title'); 
$(this).fadeIn(); 
+0

No es necesario crear dos jQuery '$ (this)' ... 'var obj = $ (this) .find ('. Funky'). Css ('width', 30) .attr ('title' , 'Funky Title'); Obj.fadeIn(); ' – Matt

+0

por supuesto, si lo almacena en una variable, pero eso no es lo que la mayoría de los usuarios de jQuery tienden a escribir en mi experiencia, simplemente" abusan "de $(). es por eso que encontré la chainable elegante - uno puede mantenerse barato en variables :). Además tu código es smt diferente al mío ... (desvaneciendo '$ (this) .find ('. funky')' en lugar de '$ (this)') – kares

+0

@Matt - eso no tendrá el mismo efecto , su variable 'obj' se refiere a algunos elementos' .find', no 'this' :) –

Cuestiones relacionadas