7

jQuery ユーティリティ関数 jQuery.data() に関して、オンライン ドキュメントには次のように記載されています。

「jQuery.data() メソッドを使用すると、循環参照やメモリ リークから安全な方法で、任意の型のデータを DOM 要素にアタッチできます。」

使用する理由:

document.body.foo = 52; 

メモリリークが発生する可能性があります-またはどのような状況で-使用する必要があります

jQuery.data(document.body, 'foo', 52);

いずれにせよ、expandos を使用する代わりに、常に .data() を優先する必要がありますか?

(違いを比較するための例を提供していただければ幸いです)

ありがとう、

ブラク・オズドガン

4

3 に答える 3

7

あなたが与えた引用に「循環参照から安全に」と書かれているため、それは正確に優れています。

ノードを参照する変数nodeOneとがあるとします。nodeTwo

次に、これを関数に入れます(その参照は保存しません):

jQuery.data(nodeOne, 'item', nodeTwo);
jQuery.data(nodetwo, 'item', nodeOne);

関数の実行後、循環参照があります。nodeOne には nodeTwo への参照があり、その逆もあります。

jQuery.data を使用すると、その循環参照によってこれら 2 つの変数のガベージ コレクションが妨げられることはありません。

ただし、jQuery.data を使用せずに同じことを行うと、変数が不要になったとしても、変数nodeOneと変数はガベージ コレクションされません。nodeTwo

--

いずれにせよ、expandos を使用する代わりに、常に .data() を優先する必要がありますか?

大量のデータ設定を行っていて、パフォーマンスをさらに低下させる必要があり (プロファイリングを使用して確認できます)、循環参照 (または少なくとも重要な数) を作成しないことが確実でない限り、はい、 jQuery.data のみを使用することもできます。

于 2010-04-30T12:23:54.570 に答える
5

のようなプリミティブ値でメモリリークを導入できないと確信しています52。通常、expandos によるメモリ リークは、要素への参照を持つオブジェクトを含む値が適用されるときに発生します。

http://msdn.microsoft.com/en-us/library/Bb250448にある循環参照の見出しの内容を読むことをお勧めします。さらに良いことに、それをすべて読んでください:-)

そうは言っても、ほとんどの人は可能であればexpandosを使用しないことをお勧めします(通常は可能です)。いずれにせよ、 jQuery を使用data()することは良い代替手段です。


質問に答えていないことに今気づきました笑。jQuerydata()には、次のようなメソッドが用意されています。

  1. jQuery はデータの一意の ID を計算します
  2. データはdata()、一意の ID を使用して、メソッドで使用可能なオブジェクトに保存されます
  3. 一意の ID をプリミティブ値として要素に expando プロパティが適用されます。

データを取得するために呼び出すたびにdata()、jQuery は一意の ID の expando プロパティにアクセスし、その ID を使用してキャッシュ オブジェクトからデータを取得します。expando にはプリミティブ値が含まれており、キャッシュ オブジェクトに関連付けられていないため、循環参照は発生しません。

于 2010-04-30T12:20:44.327 に答える
3

この件に関するいくつかの素晴らしい読み物:

JavaScript のメモリ リーク パターン

于 2010-04-30T12:24:55.770 に答える