11

次のコードはメモリ リークを引き起こしますか。

jQuery のドキュメントによると、このdata関数を使用するとメモリ リークが回避されます。以下が安全かどうかを確認するのに役立ちます。

var MyClass = function(el) {
    // Store reference of element in object.
    this.element = $(el);
};

// Store reference of object in element.
$('#something').data('obj', new MyClass('#something'));
4

4 に答える 4

7

明らかに、DOM 要素がまだ DOM に接続されている限り、そのままのコードは余分なメモリを消費します。しかし、DOM要素が使用されなくなった後も追加のメモリを引き続き使用するかどうかを尋ねていると思います。

更新: Joey の回答 (彼はその後削除した) のおかげで、私はjavascript のメモリ リークを調べるのに時間を費やしましたが、以下の段落の私の仮定が間違っているようです。DOM 要素は純粋なガベージ コレクションを使用しないため、通常、このような循環参照により、DOM 要素と JavaScript オブジェクトの両方が解放されなくなります。ただし、この回答の残りの部分はまだ正しいと思います。

JavaScript エンジンがガベージ コレクションをどのように実装するかについての深い知識がなければ、このトピックについて正式に話すことはできません。ただし、ガベージ コレクションに関する私の一般的な理解では、#something要素が DOM から削除された後、結果MyClassのオブジェクトには、他の接続を持たないオブジェクトへの参照のみが含まれるという意味で、コードは「安全」であると考えられます。ガベージ コレクターのグラフ アルゴリズムは、DOM 要素とそのMyClassオブジェクトが「空間に浮いており」、他のすべてに接続されていないことを識別できる必要があります。

さらに、jQuery は、特定の DOM 要素が DOM から削除されると、その要素に関連付けられているデータとイベントを削除するために最善を尽くします。ドキュメントから:

jQuery は、DOM 要素が jQuery メソッドによって削除されたとき、およびユーザーがページを離れたときに、データが削除されることを保証します。

したがって、jQuery を一貫して使用すると仮定すると、とにかくオブジェクトが DOM から削除されると、一方向の参照しか得られないため、ガベージ コレクターがこれらのオブジェクトを削除できることを認識しやすくなります。

そのため、DOM 要素が削除された後にオブジェクトを参照するものが他にない限りMyClass、メモリ リークは発生しません。

于 2011-08-16T16:31:33.887 に答える
0

Javascritpエンジンに依存していると思います。

テストを実行するのに十分正確な質問があります。オブジェクトに長い文字列を追加し、潜在的なリークを大きなループで実行しました。

結果、IE8でもChromeでもリークはないと思います。

しかし、これらの漏れパターンも再現できませんでした。

于 2011-08-16T16:47:58.833 に答える
-4

data属性は、文字列値のみを格納します。

于 2011-08-16T16:19:51.543 に答える