配列が他のメソッドやDOM要素への参照のない単純なオブジェクトで構成されている場合は、上記のすべてのソリューションで十分です。
ただし、配列にオブジェクトが含まれている場合、そのオブジェクトはDOM要素にアタッチしたイベントハンドラーへの参照を保持しますが、配列をクリアしてもオブジェクトは破棄されません。
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')];
ここで、を使用して配列を「リセット」した場合myArray = []
。配列はクリーンアップされますが、オブジェクトにはノードと、ボタンがクリックされたときにトリガーされるライブイベントハンドラーが保持されます。つまり、オブジェクトをメモリから削除することはできません。配列から削除することにより、それへの参照を失っただけです。
複雑なオブジェクトを何らかの方法で「破棄」し、保持している参照をすべて削除する必要があるという点で、最初の考えは正しかったです。
Complex.prototype.release = function() {
this.node.removeEventListener('click',this.handler);
delete this.handler;
delete this.node
}
ここで、配列をループし、オブジェクトに対してreleaseを呼び出して、ノードからイベントリスナーを削除します。
これは、人々が通常見逃していると思うことの簡単な例です。イベントハンドラーである必要はありませんが、複雑なオブジェクトの外部で参照されるものであれば何でもかまいません。