jQuery.dataと生の展開プロパティ(DOMノードに割り当てることのできる任意の属性)の宣伝されている利点の1つは、jQuery.dataが「循環参照から安全であり、メモリリークがない」ということです。 WebアプリケーションのためのJavaScriptの正確な説明<-> DOM循環参照の問題
最も一般的なメモリリークがJavaScriptのスクリプトエンジンとブラウザのC++ オブジェクトのJavaScriptの間で例えば(DOMの実装間の循環 参照を伴う:"Optimizing JavaScript code"題しGoogleからの記事では、より多くの詳細に立ち入りスクリプト エンジンとInternet ExplorerのCOMインフラストラクチャ、または JavaScriptエンジンとFirefox XPCOMインフラストラクチャの間)。 Expando →中間オブジェクト→ DOM要素
介し
DOM要素→イベントハンドラ→閉鎖スコープ→ DOM
DOMエレメント→:
それは円形の基準パターンの2つの例を示します
しかし、DOMノードとJavaScriptオブジェクトの間の参照サイクルでメモリリークが発生した場合、これは自明ではないイベントハンドラ(例: onclick
)はこのようなリークを生成するでしょうか?
DOM要素はイベントハンドラを参照しています。私はそれを見る方法ので、私は、それが基準サイクルを避けるために、イベントハンドラのためにも、可能ですか表示されません。
イベントハンドラは、(直接的または間接的に)DOMを参照します。どんな場合でも、
window
を興味深いイベントハンドラで参照することを避けることは、ほとんどありません。setInterval
ループを書き込んで、グローバルキューからアクションを読み込むのは簡単ではありません。
JavaScript ↔ DOM循環参照問題の詳細な説明はありますか?私が明確にしたいもの:
どのブラウザが影響を受けますか? jQueryソースのコメントには特にIE6-7が含まれていますが、Googleの記事によるとFirefoxにも影響があることが示唆されています。
expandoプロパティとイベントハンドラは、メモリリークに関してどういう違いがありますか?または、これらのコードスニペットの両方が、同じ種類のメモリリークの影響を受けやすいのですか?
// Create an expando that references to its own element. var elem = document.getElementById('foo'); elem.myself = elem; // Create an event handler that references its own element. var elem = document.getElementById('foo'); elem.onclick = function() { elem.style.display = 'none'; };
ページが原因循環参照に、メモリリークが発生した場合、全体のブラウザアプリケーションが閉じている、またはウィンドウ/タブが閉じられたときに、メモリが解放されるまで、漏れが持続しますか?
このコードは実際にメモリリークを引き起こしますか?私はなぜなのか理解していない。 var elem = document.getElementById( 'foo'); elem.myself = elem; – CEGRD