2012-08-14 12 views
5

quiero tener un montón de objetos, digamos:¿Cómo suprimir Javascript lienzo

function Block() { 
    this.canvas; 
} 

blocks = []; 

Y en ocasiones Especificaré:

block[x] = new Block(); 

y luego:

block.canvas = document.createElement('canvas'); 

Pero también querré eliminar este nuevo lienzo para liberar memoria algunas veces. ¿Solo tengo que hacer:

block.canvas = null; (or whatever the appropriate method is) 

Y luego, javascript liberará la memoria en algún momento? ¿O hay una forma explícita de eliminar el objeto y liberar la memoria?

Gracias!

+0

Gracias por las respuestas chicos, todo muy útil. ¡Aparentemente no puedo votar aún! – saward

Respuesta

7

La memoria, que se toma por objetos, que no se hace referencia en ninguna parte, se recupera en JavaScript mediante la recolección de basura (MDN docu on this).

Por lo tanto, para liberar la memoria, solo tiene que eliminar todas las referencias a sus objetos canvas y en la siguiente ejecución del recolector de elementos no utilizados, la memoria se liberará nuevamente.

Esto se puede hacer, como lo hizo, utilizando block.canvas = null; o (según el alcance de objetos/propiedades) por delete block.canvas.

Pero asegúrese de eliminar cada referencia. ¡Esto también puede ser referencia por el DOM o cualquier otro objeto!

1

Javascript tiene un operador llamado de borrado:

delete block.canvas; 

Ejemplos: http://www.openjs.com/articles/delete.php

+0

Use 'block.canvas = null' en su lugar. 'delete' modifica la estructura de' block' en tiempo de ejecución, y es una operación contraproductiva/costosa. Ver https://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/#de-referencing-misconceptions – mems

0

mayoría Javascript motor utiliza referencia contando o de marcaje y de intercambio como su política de GC, por lo que cualquier objeto con ninguna referencia al objeto global (ventana en el entorno del navegador) se liberaría en algún momento.

Así que para asegurarse de que su elemento <canvas> podría ser recogidos, usted debe asegurarse de:

  • Sin variable o propiedad referencias de esto, mediante la ejecución de block.canvas = null a hacer las cosas
  • El elemento <canvas> ya no se adjunta a la árbol DOM, mediante la ejecución de canvas.parentNode.removeChild(canvas) que podría hacer que se haga

Desde su código proporcionado, no se hace la extracción DOM, tal vez su <canvas> no está conectado al árbol DOM, pero si lo está, recuerde eliminarlo.

PS: Me di cuenta algunas respuestas Metión la palabra clave delete para quitar la propiedad canvas, pero en realidad no es lo necesite, trabaja GC como se esperaba justo después block.canvas se establece en null, ya a delete may cause V8 to run more slowly, mi consejo es evitar el uso de delete.

3

No es suficiente si realmente usa ese lienzo para dibujar objetos. Si agrega el lienzo a DOM, también debe quitarlo, de lo contrario, permanecerá en la memoria, por supuesto. Si va a añadir que el uso de appendChild, debe eliminarlo usando removeChild


En una nota lateral, si usted va a tener montón de objetos como usted dice, es muy mala idea tener lienzo por objeto. Deberías pensar en tener lienzo por capa visual.

Cuestiones relacionadas