web-dev-qa-db-ja.com

JavaScript:document.createElement( '')&DOMElementを削除

次のような関数内に要素を作成すると、

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
}

そして、あなたはそれをDOMのどこにも追加しません、すなわち.appendChild関数を介して、それはまだメモリに残っていますか?だからあなたはしなければならないでしょう

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
   delete createdElement;
}

私は興味があります:)

46
Gary Green

ブラウザによって異なりますが、javascript deleteキーワードはDOMのcreateElementメソッドとは関係ありません。 deleteを使用する必要はありません。

何が起きるかは、現在createdElementに保持されている要素への参照がガベージコレクションされることです。 IEの場合は、要素の参照カウントが0にドロップされるため、それ自体が破壊されてメモリが解放されます。他のブラウザは通常、DOMの要素とは異なる方法で動作しますそれ自体がガベージコレクションされたオブジェクトであり、同じ(またはおそらくDOM固有の)GCサイクル中に削除されます。

要素がドキュメントに追加された場合、IEの場合、要素に別の参照が追加されるため、createdElementの参照が削除されても、要素オブジェクトは引き続きゼロ以外の参照カウントを持ち、存在し続けます。

要素自体がガベージコレクションされている他のブラウザーの場合、コレクターはドキュメントに接続されているオブジェクトのグラフに要素を表示するため、要素は収集されません。

36
AnthonyWJones

関数が終了すると、オブジェクトへの参照はなくなります。つまり、ガベージコレクターが正しく機能している場合は、それを収集する必要があります(IEバグがあり、循環参照を持つオブジェクトが収集されない場合、 DOMノードが含まれます)。

また、ローカル変数は削除できないため、コードが壊れています。削除しようとすると、厳密モードES5で構文エラーがスローされます。

11
Christoph