2010-04-30 11 views
6

En cuanto a jQuery función de utilidad jQuery.data() la documentación en línea dice:¿Por qué la función .data() de jQuery es mejor para evitar pérdidas de memoria?

"El método

jQuery.data() nos permite transmitir los datos de cualquier tipo de DOM elementos en una forma que es seguro . de referencias circulares y por lo tanto de fugas de memoria "

Por qué usar:

document.body.foo = 52; 

puede dar lugar a una pérdida de memoria -o en qué condiciones- por lo que debo utilizar

jQuery.data(document.body, 'foo', 52); 

¿Debo siempre prefieren .data() en lugar de utilizar expandos en cualquier caso?

(Le agradecería si usted puede proporcionar un ejemplo para comparar las diferencias)

Gracias,

Burak Ozdogan

+1

http://stackoverflow.com/questions/1056098/what-sort-of-memory-leaks-should-i-watch-for- with-jquerys-data responde a tu pregunta? – Konerak

+0

¿Puedo adivinar? IE sufre de este mal durante una década. Pero AFAIK solo ocurre cuando elimina/separa un elemento DOM mientras todavía tiene configurados los manejadores de eventos. – jweyrich

+0

@jweyrich: mientras que IE tiene notoriedad famosa por la pérdida de memoria, otros navegadores no son inmunes. –

Respuesta

6

Es mejor precisamente por algo que dice en la cita que dio: "a salvo de referencias circulares".

Supongamos que tiene las variables nodeOne y nodeTwo, que nodos de referencia.

Digamos que luego poner esto en una función (cuya referencia no almacena):

jQuery.data(nodeOne, 'item', nodeTwo); 
jQuery.data(nodetwo, 'item', nodeOne); 

Después se ejecuta la función, hay una referencia circular: nodeone tiene un árbitro nodeTwo, y viceversa.

Al usar jQuery.data, esa referencia circular no evitará que esas dos variables sean recolectadas.

Sin embargo, si tuviera que hacer lo mismo pero sin usando jQuery.data, las variables nodeOne y nodeTwo no serían basura recogidos, incluso si las variables ya no son necesarios.

-

¿Debo siempre prefieren .data() en lugar de utilizar expandos en cualquier caso?

A menos que usted está haciendo grandes cantidades de datos de configuración y la necesidad de cualquier gota extra de rendimiento (y se podría decir por el uso de perfiles) y están seguros de que no va a crear referencias circulares (o, al menos, un número que importaría), entonces sí, también puedes usar jQuery.data.

+0

Gracioso, esto fue downvoted drive-by. – fig

+0

Espera, ¿tu muestra de código dice que '.data()' de jQuery hace o no permite que 'nodeOne' y' nodeTwo' obtengan basura? –

+0

@Crescent Fresh, buen punto, lo aclararé. – fig

4

Estoy bastante seguro de que no se puede introducir una pérdida de memoria con una valor primitivo como 52. Las pérdidas de memoria con expandos generalmente ocurren cuando se aplica un valor que contiene un objeto con una referencia de regreso al elemento.

Sugiero leer el contenido del encabezado de referencia circular en http://msdn.microsoft.com/en-us/library/Bb250448. Mejor aún, léelo todo :-)

Habiendo dicho eso, creo que la mayoría de las personas recomiendan no usar expandos si es posible (y generalmente es posible). Usar jQuery's data() es una buena alternativa, en cualquier caso.


Acabo de dar cuenta de que no he respondido a su pregunta ja ja. jQuery de data() proporciona un método que es algo como el siguiente:

  1. jQuery calcula un ID único para los datos
  2. los datos se almacenan en un objeto disponible para el método data(), utilizando el identificador único
  3. Un propiedad expando se aplica al elemento con el identificador único como un valor simple

Siempre que llame a data() recuperar los datos, jQuery acceso a la propiedad expando para el identificador único y utiliza esa identificación para obtener los datos desde el objeto de almacenamiento en caché Debido a que el expando contiene un valor primitivo y no tiene datos adjuntos al objeto de almacenamiento en caché, no se producen referencias circulares.

+0

Gracias Andy E's Head (Esto se ve algo de Futurama! :)) Información muy útil que ha proporcionado. – pencilCake

+0

@burak: Soy un gran fanático de Futurama :-) –

Cuestiones relacionadas