2011-08-16 28 views
11

¿El siguiente fragmento de código crearía una pérdida de memoria?¿Puede jQuery.data causar una pérdida de memoria?

Según la documentación de jQuery, el uso de la función data evita fugas de memoria. Sería útil confirmar si lo siguiente es seguro.

var MyClass = function(el) { 
    // Store reference of element in object. 
    this.element = $(el); 
}; 

// Store reference of object in element. 
$('#something').data('obj', new MyClass('#something')); 
+0

¿Por qué no guarda la referencia en el objeto global js? –

+0

@ant_Ti Me gustaría tener acceso de dos vías. Por ejemplo, en un controlador de eventos me gustaría acceder a 'obj', pero también me gustaría poder acceder al elemento desde' obj'. –

+0

He editado la pregunta para eliminar menciones de referencias circulares, ya que este ejemplo no contiene una. (Aunque parece que podría) – mikerobi

Respuesta

7

Obviamente, el código en su forma actual ocuparía más memoria siempre que el elemento DOM aún esté conectado al DOM. Pero supongo que estás preguntando si continuaría usando memoria extra después de que el elemento DOM ya no esté en uso.

actualización: Gracias a la respuesta de Joey (que desde entonces ha suprimido), que pasó algún tiempo leyendo sobre memory leaks in javascript, y parece que mis suposiciones en el párrafo de abajo son incorrectos. Debido a que los elementos DOM no usan la recolección de basura pura, una referencia circular como esta normalmente evitaría que tanto el elemento DOM como el objeto javascript se liberen. Sin embargo, creo que el resto de esta respuesta sigue siendo correcta.

Sin un conocimiento profundo de cómo los motores de JavaScript implementan la recolección de basura, no puedo hablar con autoridad sobre el tema. Sin embargo, mi comprensión general de la recolección de basura me hace pensar que su código sería "seguro" en el sentido de que después de que el elemento de #something se retira del DOM, el MyClass objeto resultante tendría solamente una referencia a un objeto que no tiene otras conexiones . Los algoritmos de grafos del recolector de basura deben ser capaces de identificar que el elemento DOM y su objeto MyClass están "flotando en el espacio" y sin relación con todo lo demás.

Además, jQuery hace todo lo posible para eliminar datos y eventos que están asociados con un elemento DOM determinado una vez que se elimina del DOM. Desde el documentation:

jQuery asegura que los datos se quita cuando los elementos DOM se eliminan a través de métodos jQuery, y cuando el usuario abandona la página.

Así que suponiendo que el uso de jQuery constantemente, sólo tendría una referencia de un solo sentido una vez que el objeto se retira de la DOM de todas formas, lo que hace que sea que mucho más fácil posible que el recolector de basura para saber que puede conseguir deshacerse de estos objetos.

De modo que mientras no tenga otra cosa que hacer referencia al objeto MyClass una vez que se elimine el elemento DOM, no debería tener una pérdida de memoria.

+0

gracias que realmente ayuda –

-4

El atributo de datos solo almacena valores de cadena.

+2

En jQuery puede ser cualquier tipo de Javascript, incluidos Array u Object. –

+0

@ant_Ti - ¿dónde dice eso en el documento? – Neal

+0

[.data()] (http://api.jquery.com/data/) descripción dice ** valor ** El nuevo valor de datos; puede ser cualquier tipo de Javascript, incluido Array u Object. –

0

supongo que depende del motor Javascritp.

Tiene la pregunta con la suficiente precisión para realizar una prueba. Agregué una cadena larga en el objeto y ejecuté la fuga potencial en un bucle grande.

Como resultado, no creo en fugas en IE8 ni en Chrome.

Pero tampoco pude reproducir these leakeage patterns.

0

Esto puede conducir a una pérdida de memoria. la teoría del método jQuery.data pueden utilizar una clase interna de datos para los datos de caché para el elemento dom.

por supuesto, cuando se quita los datos de la caché, jQuery perderá la referencia de los datos. pero el caché interno es una matriz en aumento, cuando lo haga, continuará.

así, al final, habrá muy grande de matriz de caché, lo que conducirá fuga memeory. En una aplicación web a largo plazo, esto puede provocar un bloqueo de memoria.

Cuestiones relacionadas