2

http://www.ibm.com/developerworks/web/library/wa-memleak/このリンクのリスト5は、objがdom要素への参照であり、dom要素がobjへの参照を持っている状況を示しています。したがって、メモリリークが発生します。コード内の何がDOM要素にobjへの参照を持たせるのかを確認するのに苦労しています。誰かが私にそれを説明できますか?

ページからの抜粋:

リスト5に、JavaScriptオブジェクト(obj)にDOMオブジェクト(id "element"で参照される)への参照が含まれているクロージャを示します。次に、DOM要素にはJavaScriptobjへの参照があります。結果として生じるJavaScriptオブジェクトとDOMオブジェクト間の循環参照により、メモリリークが発生します。

リスト5.イベント処理のメモリー・リーク・パターン

<html>
<body>
<script type="text/javascript">
document.write("Program to illustrate memory leak via closure");
window.onload=function outerFunction(){
    var obj = document.getElementById("element");
    obj.onclick=function innerFunction(){
    alert("Hi! I will leak");
    };
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
    // This is used to make the leak significant
};
</script>
<button id="element">Click Me</button>
</body>
</html>
4

1 に答える 1

1

objonclickの間の循環参照が原因で、メモリ リークが発生します。

通常、onloadの実行後、そのスコープ内のすべての変数はガベージ コレクションされ、消去されます。ただし、javascript では、関数スコープは実行後に常に削除されるとは限りません。これはクロージャーと呼ばれます。

たとえば、外部オブジェクトがこのスコープ内の何かを参照する場合。この場合、onclickはouterFunctionを参照し、outerFunctionobjによって参照されます。

閉鎖によるメモリ リークの図

obj がnullに設定される場合、 onload-scope内の何かへの参照はありません。

参照は依然としてouterFunctionへのものであると主張できますが、これは正しいことです。しかし、outerFunction はもはやonload-scopeにバインドされていないため、このスコープはガベージ コレクターによってクリーンアップされます。

于 2013-03-19T10:59:14.470 に答える