5

重複の可能性:
JavaScriptで配列を空にする方法
javascriptで配列の配列の割り当てを解除する最良の方法

私はオブジェクトの配列を持っています:

var arr = [complexObj1, complexObj2];

アレイをクリアしてメモリリークがないことを確認したい場合、次のようにしますか?

arr.length = 0;

または、配列を反復処理して、次のようなものを呼び出す必要がありますか?

complexObj.release(); or
arr[0] = null; or 
delete arr[0];

4

4 に答える 4

2

配列が他のメソッドや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を呼び出して、ノードからイベントリスナーを削除します。

これは、人々が通常見逃していると思うことの簡単な例です。イベントハンドラーである必要はありませんが、複雑なオブジェクトの外部で参照されるものであれば何でもかまいません。

于 2012-10-08T11:00:23.700 に答える
1

アレイを再初期化するだけです。

arr = [];
于 2012-10-08T09:42:25.797 に答える
0

あなたはただする必要があります

arr = null
于 2012-10-08T09:42:34.870 に答える
0

何かのようなもの

var t = myArray;
delete myArray;
//or
myArray = null;
于 2012-10-08T09:45:49.947 に答える