Si le tableau est constitué d'objets simples sans références à d'autres méthodes ou éléments du DOM, toutes les solutions ci-dessus suffisent.
Si, toutefois, le tableau contient des objets qui, à leur tour, contiennent des références à des gestionnaires d'événements que vous avez attachés à des éléments du DOM, l'objet ne sera pas détruit lorsque vous effacerez le tableau.
var Complex = function(nodeId){
this.node=document.getElementById(nodeId);
this.handler=function(e){alert('wohooo'};
this.node.addEventListener('click', this.handler);
}
var myArray = [new Complex('buttonOne'), new Complex('buttonTwo')];
Si vous réinitialisez maintenant le tableau en utilisant myArray = []
. Le tableau sera nettoyé mais les objets contiennent toujours un nœud et un gestionnaire d'événement en direct qui se déclenchera lorsque les boutons seront cliqués, ce qui signifie que l'objet ne peut pas être supprimé de la mémoire. Vous avez juste perdu la référence à cet objet en le retirant du tableau.
Votre première idée était correcte : vous deviez en quelque sorte "détruire" l'objet complexe et supprimer toutes les références qu'il contient.
Complex.prototype.release = function() {
this.node.removeEventListener('click',this.handler);
delete this.handler;
delete this.node
}
Vous bouclez maintenant dans le tableau et appelez release sur les objets pour supprimer les écouteurs d'événements du nœud.
C'est un exemple simple de ce que je pense que les gens ratent généralement. Il ne s'agit pas forcément de gestionnaires d'événements, mais de tout ce qui est référencé en dehors de l'objet complexe.