jQuery.data()方法与内存泄漏

作者:dishuipiaoxiang 来源:Denis'Blog 时间:2010-04-06 17:20:00 

jQuery的官方文档中,提示用户这是一个低级的方法,应该用.data()方法来代替。$.data( element, key, value )可以对DOM元素附加任何类型的数据,但应避免循环引用而导致的内存泄漏问题,原文如下:

The jQuery.data() method allows us to attach data of any type to DOM elements in a way that is safe from circular references and therefore from memory leaks. We can set several distinct values for a single element and retrieve them later:

但对于该方法,存在的问题也不仅于此。在JQUERY FORUM中 ,对该问题作了深入的讨论,robert.katic 提出了一条解决方案。$.data()方法应用到宿主对象上,运行会得到优化,但在本地对像上使用该方法,结果未必尽如人意。一个元素在正常情况下可以使用.remove()方法将其删除,并清除各自的数据。但对于本地对象而言,这是不能彻底删除的,这些相关的数据一直持续到窗口对象关闭。同样,这些问题也存在于event 对象中,因为事件处理器(handlers)也是用该方法来存储的。

那么,要解决该问题最简单的方法是将数据存储到本地对象新增的一个属性之中。即:

// ...
if ( elem.nodeType ) { 
        cache[ id ] = dataObject; 
        elem[ expando ] = id;
} else { 
        elem[ expando ] = dataObject;
}
// ...

但是,一旦涉及到继承问题,该方法就无能为力。试看:

var parent = {};
var childA = Object.create( parent );
var childB = Object.create( parent ); 
 
$.data( parent, "foo", "parent value" ); 
 
// This may even be intentional
$.data( childA, "foo" ) 
// => "parent value"
$.data( childB, "foo" ) 
// => "parent value" 
 
// This may NOT be intentional
$.data( childA, "foo", "childA value" );
$.data( parent, "foo" ) 
// => "childA value"
$.data( childB, "foo" ) 
// => "childA value"

开始时,存储数据的对象不存在,因此创建一个对象来存储新的值,如图

现在,我们尝试去修改对象childA同样的数据。

对象childA并不存在该数据,因此它沿着原型链向上查找,父对象刚好拥有该数据,其值立即被改写。所以,从parent和childB这两个对象获取“foo”的值,得到的将是“childA value”,而不是“parent value”。

标签:jQuery,内存,泄露
0
投稿

猜你喜欢

  • JavaScript正则表达式的简单应用:高亮显示

    2008-07-20 12:46:00
  • sql exist的妙用

    2007-11-08 11:47:00
  • JavaScript缓动库

    2009-05-25 12:50:00
  • 怎样设计网站首页?(解答)

    2007-11-04 18:56:00
  • asp 简单分页代码

    2011-03-11 10:53:00
  • IE7的web标准之道 Ⅱ

    2008-08-13 12:50:00
  • 陌生网页交互行为分析(1)——奇怪的关闭按钮

    2009-01-08 12:22:00
  • DreamWeaver制作会移动的广告条

    2008-02-03 11:34:00
  • javascript 函数调用的对象和方法

    2010-07-02 12:25:00
  • WEB3.0时代的开放与聚合

    2008-08-21 17:19:00
  • 文档标准的真实谎言

    2008-06-02 10:46:00
  • Safari参考样式库之webkit

    2009-07-26 09:50:00
  • Typecho插件实现添加文章目录的方法详解

    2023-05-25 07:19:04
  • 19个ASP编程基础典型代码

    2008-10-23 15:46:00
  • QCon大会散记

    2010-05-03 14:19:00
  • JavaScript中的this指针用法

    2007-08-26 17:29:00
  • asp如何准确获知对方来访问的时间和URL?

    2010-07-07 12:25:00
  • 有关简洁网页设计需知的6点技巧

    2012-04-25 20:55:01
  • IE8新特性及IE8安装使用 目录

    2008-04-01 09:50:00
  • ASP实现SQL语句日期格式的加减运算

    2008-11-07 15:13:00
  • asp之家 网络编程 m.aspxhome.com