Una de las ventajas de jQuery.data frente a las propiedades de expansión sin procesar (atributos arbitrarios que puede asignar a los nodos DOM) es que jQuery.data es "seguro de referencias circulares y por lo tanto libre de pérdidas de memoria". Un artículo de Google titulado "Optimizing JavaScript code" entra en más detalles:Explicación precisa de JavaScript <-> DOM cuestión de referencia circular
Las pérdidas de memoria más comunes para aplicaciones web implican circulares referencias entre el motor de scripts de JavaScript y C++ objetos de los navegadores implementación del DOM (por ejemplo, entre el código JavaScript script motor y la infraestructura COM de Internet Explorer, o entre el motor de JavaScript y la infraestructura Firefox XPCOM).
enumera dos ejemplos de patrones de referencia circulares:
elemento DOM → controlador de eventos alcance → cierre → DOM
elemento DOM → través expando → intermediario objeto → elemento DOM
Sin embargo, si un ciclo de referencia entre un nodo DOM y un objeto JavaScript produce una pérdida de memoria, ¿no significa esto que cualquier controlador de eventos no triviales (p. onclick
) producirá tal fuga? No veo cómo es incluso posible que un controlador de eventos para evitar un ciclo de referencia, debido a la forma en que lo veo:
El elemento DOM referencia al controlador de eventos.
El controlador de eventos hace referencia al DOM (directa o indirectamente). En cualquier caso, es casi imposible evitar hacer referencia a
window
en cualquier controlador de eventos interesante, salvo escribir unsetInterval
bucle que lee acciones de una cola global.
Puede alguien dar una explicación precisa del DOM problema de referencia circular JavaScript ↔? Cosas que me gustaría aclarar:
¿Qué navegadores se efectúan? Un comentario en la fuente de jQuery menciona específicamente IE6-7, pero el artículo de Google sugiere que Firefox también se ve afectado.
¿Las propiedades de expansión y los controladores de eventos son de alguna manera diferentes con respecto a las pérdidas de memoria? ¿O ambos fragmentos de código son susceptibles al mismo tipo de pérdida de memoria?
// Create an expando that references to its own element. var elem = document.getElementById('foo'); elem.myself = elem; // Create an event handler that references its own element. var elem = document.getElementById('foo'); elem.onclick = function() { elem.style.display = 'none'; };
Si una memoria de páginas fugas debido a una referencia circular, no la fuga persistir hasta que toda la aplicación del navegador se cierra, o se libera la memoria cuando el/pestaña de la ventana está cerrada?
¿Este código realmente podría causar pérdida de memoria? No entiendo porque. var elem = document.getElementById ('foo'); elem.myself = elem; – CEGRD