Comment faire pour supprimer le javascript toile
Je veux avoir un tas d'objets, disons:
function Block() {
this.canvas;
}
blocks = [];
Et je vais à plusieurs reprises de préciser:
block[x] = new Block();
et puis:
block.canvas = document.createElement('canvas');
Mais je vais aussi vouloir supprimer cette nouvelle toile pour libérer de la mémoire parfois. Dois-je tout simplement besoin de faire:
block.canvas = null; (or whatever the appropriate method is)
Et javascript permettra de libérer de la mémoire à un certain stade? Ou est-il une manière explicite la suppression de l'objet et de libérer de la mémoire?
Merci!
- Merci pour les réponses les gars, tous très utiles. Apparemment je ne peux pas upvote pourtant si!
Vous devez vous connecter pour publier un commentaire.
De la mémoire, qui est pris par les objets, qui sont référencés nulle part, est récupéré en JavaScript par le la collecte des ordures (MDN docu sur ce).
Afin de libérer de la mémoire, il suffit de supprimer toutes les références à vos
canvas
des objets et dans la prochaine exécution du garbage collector, la mémoire sera libérée de nouveau.Cela peut être fait, comme vous l'avez fait, à l'aide de
block.canvas = null;
ou (selon les objets/propriétés de la portée) pardelete block.canvas
.Mais assurez-vous que vous supprimez chaque de référence. Cela peut aussi être des références par le DOM ou tout autre objet!
Il n'est pas assez si vous êtes en train d'utiliser ce canevas pour dessiner des objets. Si vous êtes en train d'ajouter de la toile à DOM, vous devez également retirer de lui, sinon il restera dans la mémoire de stage. Si vous ajoutez à l'aide de
appendChild
, vous devriez les supprimer en utilisantremoveChild
Sur une note de côté, si vous allez avoir des tas d'objets comme vous le dites, c'est vraiment de la mauvaise idée d'avoir de la toile par objet. Vous devriez penser à avoir de la toile par visual couche.
Javascript a un opérateur nommé supprimer:
Exemples: http://www.openjs.com/articles/delete.php
block.canvas = null
à la place.delete
modifier la structure deblock
au moment de l'exécution, et c'est un contre-productif et le coût élevé de l'opération. Voir smashingmagazine.com/2012/11/...La plupart des moteur javascript utilise de comptage de référence ou mark-and-swap comme son GC en matière de politiques, de sorte que n'importe quel objet sans référence à l'objet global (de la fenêtre dans le navigateur de l'environnement) serait libéré jusqu'à un certain stade.
Afin d'assurer votre
<canvas>
élément pourrait être collectées, vous devriez assurez-vous que:block.canvas = null
vous faites les choses<canvas>
élément n'est plus attaché à l'arbre du DOM, en exécutantcanvas.parentNode.removeChild(canvas)
vous pourrait-il faire en faitÀ partir de votre code fourni, vous n'avez pas à faire la DOM suppression, peut-être que votre
<canvas>
n'est pas attaché à l'arborescence du DOM, mais si elle l'est, n'oubliez pas de le supprimer.PS: j'ai remarqué quelques réponses metion la
delete
mot-clé à supprimer lecanvas
propriété, mais il est vraiment pas nécessaire, GC fonctionne comme prévu juste aprèsblock.canvas
est fixé ànull
, depuis unsupprimer
peut causer V8 à exécuter plus lentement, mon conseil est d'éviter l'utilisation dedelete
.