【JavaScript】切り離されたDOM要素が引き起こすメモリリークの原因と対策
切り離されたDOM要素(Detached DOM)とは
切り離されたDOM要素とは、DOMから削除されたにもかかわらず、JavaScriptによってメモリが保持され続けている要素のことです。つまり、その要素がどこかの変数やオブジェクトから参照されている限り、DOMから取り除かれた後でもガベージコレクションの対象にならず、メモリ上に残り続けます。
DOMは双方向にリンクされたツリー構造を持っています。このため、ツリー内のたった1つのノードへの参照が残っているだけで、そのツリー全体がガベージコレクションの対象から外れてしまうのです。
例えば、JavaScriptでDOM要素を作成した後、その要素を削除したものの、要素を保持している変数を削除し忘れたケースを考えてみましょう。このような状況では、該当するDOM要素だけでなく、その要素が属するツリー全体への参照が残り続けることになり、切り離されたDOM(Detached DOM)が発生します。
具体例
次の例では、DOMから削除された後も「someText」がグローバルオブジェクト「value」から参照され続けています。このため、ガベージコレクターによって解放されることができず、メモリを消費し続けます。これがメモリリークの原因です。
<html>
<body>
<script>
var example = document.createElement("p");
example.id = "someText";
document.body.appendChild(example);
var value = {
text: document.getElementById('someText')
};
function createFun() {
value.text.innerHTML = "Javascript is not Java";
}
createFun();
function deleteFun() {
document.body.removeChild(document.getElementById('someText'));
}
deleteFun();
</script>
</body>
</html>メモリリークを回避する方法
メモリリークを防ぐためのベストプラクティスは、「var example」といった宣言をリスナー(関数)の中に記述し、ローカル変数として扱うことです。ローカル変数であれば、処理が完了した時点でオブジェクトへの参照パスが切断されるため、ガベージコレクターが不要になったメモリを適切に解放できるようになります。
-
Internet ExplorerでJavaScriptのエラーをデバッグする基本手順
JavaScriptのエラーを特定する最も基本的な方法は、ブラウザ側でエラー情報の表示を有効にすることです。本記事では、Internet Explorer(IE)を使ってJavaScriptのエラーを確認・デバッグするための手順を解説します。 ステータスバーのエラーアイコンからエラーを確認する Internet Explorerでは、デフォルト設定のままでも、ページ上でスクリプトエラーが発生すると、ウィンドウ左下のステータスバーにエラーアイコンが表示されます。 このアイコンをダブルクリックすると、ダイアログボックスが開き、発生したエラーの詳細(エラー内容や行番号など)を確認できます。手軽な方法
-
JavaScriptでボタンクリック時にli要素を削除する方法
Webアプリケーションでは、リスト項目を動的に削除できるようにしたいケースはよくあります。この記事では、各要素(li)に配置した「削除」ボタンをクリックすることで、該当する要素をJavaScriptだけで削除する方法を解説します。 前提:対象となる順序なしリスト(ul) 例として、次のような順序なしリスト(ul)を想定します。 <ul> <li class="subjectName">JavaScript <button>Remove</button></li> <br> <