この記事では、jQuery ソース コードのデータ バッファリングについての学習を主に紹介します。これには特定の参考値があります。必要な友達はそれを参照できます。
メモリ リークとは、メモリ ブロックがブラウザ プロセスによって使用または終了できないことを意味しますか?ブラウザは自動ガベージ コレクションを使用してメモリを管理しており、これはすでに非常に優れていますが、まだバグがあるため、メモリ リークが発生します。
一般的なメモリ リークは次のとおりです:
jquery のバッファリング メカニズムは、この問題を解決します。
jqueryのバッファリング機構
アイデア:
cache
を jquery 上に作成することです。 cache
来存放我们想要再DOM中保存的数据。
但是问题又来了,我们怎么实现对DOM元素于jquery中的cache
对象中的数据的映射呢?
我们首先再DOM对象上创建一个唯一性的属性,他是expando
的值。而expando
的值是一个字符串,'jquery'+date
,基本上可以保证这个属性再不同DOM的唯一性。
接着把每个结点的dom[expando]
`的值设为是一个自增长的id,保持全局的唯一性,既可以使用cache[id]
`就可以获取到对应的数据了。即id就好比是打开一个房间(DOM节点)的钥匙。 而每个元素的所有缓存都被放到了一个map映射里面,这样可以同时缓存多个数据。
总之,现在DOM元素上找到expando
cache
オブジェクト内のデータに DOM 要素をどのようにマッピングするのでしょうか? まず、DOM オブジェクトに一意の属性を作成します。これは expando
の値です。 expando
の値は文字列 'jquery'+date
であり、基本的に DOM に関係なくこの属性の一意性が保証されます。
dom[expando]
` の値を自己増加する ID に設定して、グローバルな一意性を維持します。また、cache[id]
` を使用することもできます。対応するデータを取得します。つまり、ID はルーム (DOM ノード) を開くための鍵のようなものです。 各要素のすべてのキャッシュはマップ内に配置されるため、複数のデータを同時にキャッシュできます。 つまり、
expando
の対応する値が DOM 要素 (uid) で見つかるようになりました。次に、この uid を通じてデータ バッファー Cache オブジェクトの特定のデータを見つけます。
// [1] var a = new Object(); var b = new Object(); a.r = b; b.r = a; // [2] var a = new Object(); a.r = a; // 循环引用很常见且大部分情况下是无害的,但当参与循环引用的对象中有DOM对象或者ActiveX对象时,循环引用将导致内存泄露。
var cache = { "uid1": { // DOM节点1缓存数据, "name1": value1, "name2": value2 }, "uid2": { // DOM节点2缓存数据, "name1": value1, "name2": value2 } // ...... };
以上がjQuery ソース コードでのデータ バッファリングについて学習するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。