72

次のような関数内に要素を作成する場合:

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

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

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

私はただ興味があります:)

4

2 に答える 2

60

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

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

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

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

于 2009-12-04T14:28:54.443 に答える
15

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

また、ローカル変数を削除できないため、コードが壊れています。削除しようとすると、厳格モードの ES5 で構文エラーが発生することさえあります。

于 2009-12-04T14:32:07.590 に答える