1. ¿Qué es un cierre y la cadena de alcance involucrada en el cierre no se discutirá aquí?
2. Mecanismo de recolección de basura de JavaScript
JavaScript no necesita liberar memoria manualmente, utiliza un mecanismo automático de recolección de basura. Cuando un objeto es inútil, es decir, cuando ninguna variable en el programa se refiere al objeto, la variable se lanzará de la memoria.
La copia del código es la siguiente:
var s = [1, 2,3];
var s = nulo;
// de esta manera, se lanzará la matriz original [1, 2, 3].
3. Reciclaje de citas
Tres objetos A, B, C
Aàbàc: un cierto atributo de A se refiere a B, y C también se hace referencia a C. Si A se borra, entonces B y C también se liberan.
Aàbàcàb: aquí se agrega un cierto atributo de C para referirse al objeto B. Si esto es para borrar A, entonces B y C no se liberarán porque se genera una referencia circular entre B y C.
La copia del código es la siguiente:
var a = {};
a.pro = {a: 100};
a.pro.pro = {b: 100};
a = nulo;
// En este caso, {A: 100} y {B: 100} también se lanzan al mismo tiempo.
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var dos = obj.pro.pro;
obj = nulo;
// En este caso {B: 200} no se lanzará, mientras que {A: 100} se lanzará.
4. Reciclar referencias y cierres
La copia del código es la siguiente:
function outer () {
var obj = {};
function inner () {
// El objeto OBJ se hace referencia aquí
}
obj.inner = interno;
}
Este es un tipo de referencia circular oculta y oculta. Cuando se llama a los exteriores una vez, se crean dos objetos OBJ e Inter dentro de él. La propiedad interna de OBJ se refiere al interior; El interior similar también se refiere a OBJ, porque OBJ todavía está en el entorno cerrado de Innerfun. Para ser precisos, esto se debe a la única "cadena de alcance" de JavaScript.
Por lo tanto, los cierres son muy fáciles de crear referencias circulares, y afortunadamente JavaScript puede manejar muy bien tales referencias circulares.
5. Fugas de memoria en IE
Hay varias fugas de memoria en IE, y hay una explicación detallada aquí (http://msdn.microsoft.com/en-us/library/bb250448.aspx).
Solo uno de estos se discute aquí, a saber, las fugas de memoria causadas por referencias circulares, porque esta es la situación más común.
Cuando hay una referencia de bucle entre un elemento DOM o un objeto ActiveX y un objeto JavaScript normal, IE tiene dificultades especiales para liberar tales variables. Es mejor cortar la referencia de bucle manualmente. Este error se ha solucionado en IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
"IE 6 sufrió fugas de memoria cuando se creó una referencia circular entre varios objetos, entre los cuales al menos un nodo DOM, este problema se ha resuelto en IE 7".
Si OBJ en el ejemplo anterior (Punto 4) hace referencia a un objeto de función JavaScript (interno), sino un objeto ActiveX o elemento DOM, la referencia circular formada en IE no se puede liberar.
La copia del código es la siguiente:
función init () {
var elem = document.getElementById ('id');
elem.OnClick = function () {
alerta ('Rain-Man');
// El elemento Elem se hace referencia aquí
};
}
Elem se refiere a la función de escucha de su evento de clic, y la función también hace referencia al elemento ELEM a través de su cadena de alcance. De esta manera, incluso si deja la página actual en IE, estas referencias circulares no se lanzarán.
6. Solución
El método básico es eliminar manualmente esta referencia circular. El siguiente es un ejemplo muy simple. Cuando lo use, puede construir una función AddEvent () usted mismo y borrar todos los enlaces de eventos en el evento de descarga de la ventana.
La copia del código es la siguiente:
function outer () {
var uno = document.getElementById ('One');
One.OnClick = function () {};
}
window.onunload = function () {
var uno = document.getElementById ('One');
One.OnClick = NULL;
};
Otros métodos (por: Douglas Crockford)
La copia del código es la siguiente:
/**
* Iterar a través de cierto nodo de elementos y todos los elementos descendientes
*
* @param elem nodo El nodo del elemento se borrará
* @Param Función FUNC Función para procesar
*
*/
function walkThedom (nodo, func) {
func (nodo);
nodo = node.firstchild;
while (nodo) {
walkthedom (nodo, func);
nodo = node.nextsibling;
}
}
/**
* Borrar todas las referencias del nodo DOM para evitar la fuga de memoria
*
* @param elem nodo El nodo del elemento se borrará
*
*/
función purgeeventhandlers (nodo) {
walkthedom (nodo, función (e) {
para (var n en e) {
if (typeof e [n] ===
'función') {
e [n] = nulo;
}
}
});
Lo anterior es el contenido y las soluciones relevantes para las filtraciones de memoria de JavaScript. Los amigos que lo necesitan pueden referirse a él.