2010-01-18 21 views
5

Tengo que mantener un objeto JavaScript con unas 30-40 propiedades, que actualizo cada pocos segundos. He leído que no hay tal cosa como "liberar" la memoria en JavaScript, y que el navegador acumula automáticamente la memoria no utilizada.Objetos JavaScript: Destruyéndolos

Mi pregunta es: ¿es suficiente establecer el objeto en nulo, o tengo que establecer todas sus propiedades en nulo y luego establecerlo en nulo?

var obj = []; 
obj[prop1] = "123"; 
obj[prop2] = "456"; 
//...and so on... 

// now to release the obj, is it enough if I just did: 
obj = null; 
+0

http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection – Eineki

Respuesta

1

un objeto sólo puede ser recogida si ya no es accesible. Puede lograr esto configurando todas las variables locales que hacen referencia al objeto a null (cualquier otro valor también lo haría) y eliminando (o sobrescribiendo) las propiedades de otros objetos que hacen referencia a él.

Eliminar las propiedades propias del objeto o establecerlas explícitamente en null no le hará ganar nada en este aspecto: las referencias del objeto no se considerarán 'activas' si no lo es.

+0

¡perfecto! ¡Gracias! – Dmitry

0

No es necesario establecer las propiedades en nulo. Cualquier valor almacenado en propiedades será liberado por el recolector de basura. Como alternativa, el operador delete es probable que forzar la destrucción inmediata:

delete obj; 
+2

'delete' no fuerza la destrucción del objeto - elimina las propiedades de los objetos; también, las variables locales no pueden ser eliminadas; al hacerlo, incluso hay un error de sintaxis en el modo estricto ECMAScript 5 – Christoph

1

Las únicas ocasiones (se me ocurre) en las que necesitaría establecer elementos en null son algunos casos en los que el DOM está involucrado.

Por ejemplo, si tiene un nodo con varios nodos secundarios cada uno con un controlador onclick definido por funciones anónimas, sería una buena idea establecer cada onclick a null (para evitar referencias circulares involuntarias).

<div id="delete_me"> 
    <span></span> 
    <span></span> 
</div> 

var theDiv = document.getElementById('delete_me'); 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = function() { 
    // stuff 
    }; 
} 

// Later... 
// Delete stuff. 
var divToDelete = document.getElementById('delete_me'); 

// Remove all the onclicks 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = null; 
} 

// Delete the div 
divToDelete.parentNode.removeChild(divToDelete); 
2

Las variables no son basura hasta que hay al menos una referencia a ellas. Sin embargo, tenga en cuenta que las variables globales son visibles desde "todas partes" y, a veces, puede que no se recoja la basura, porque todavía son visibles desde algún lugar.

Por ejemplo, usted tiene

Por lo tanto, me gustaría dar su consentimiento para el establecimiento de valor a null después de que haya terminado con su objeto.