,,,以下文章的前半部分是我看的时候从网络上面找的一篇指导性质的文章,写的还不错,相同的道理和话就不重复的说了,主要是语言表达能力也不好,所以我拿过来用,用后半段是我自己的解读。
,,,,,,,,考虑到作者的版权问题我们附上作者原文章地址:http://www.cnblogs.com/aaronjs/p/3370176.html
,,,,一般jQuery开发,我们都喜欢便捷式的把很多属性,比如状态标志都写到dom节点中,也就是HTMLElement
好处:直观,便捷
坏处:
- <李>
循环引用
李> <李>直接暴露数据,安全性?
李> <李>增加一堆的自定义属性标签,对浏览器来说是没意义的
李> <李>取数据的时候要对HTML节点做操作
李><强>什么是内存泄露强>
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。在c++中,因为是手动管理内存,内存泄露是经常出现的事情。而现在流行的c#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露。浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有错误,会产生内存泄露。
<强> 强>
- <李>
循环引用
李> <李>Javascript闭包
李> <李>dom插入顺序
李>一个dom对象被一个Javascript对象引用,与此同时又引用同一个或其它的Javascript对象,这个dom对象可能会引发内存泄漏。这个dom对象的引用将不会在脚本停止的时候被垃圾回收器回收。要想破坏循环引用,引用dom元素的对象或dom对象的引用需要被赋值为null。
<强> 强>
第一种:多个对象循环引用
var 一个=new 对象;var b=new 对象; a.r=b; b.r=,
第二种:循环引用自己
var 一个=new 对象; a.r=,
,
具体的就深入讨论了,这里的总结
- <李>
李> <李>
李>
,
所以在平时实际应用中,我们经常需要给元素缓存一些数据,并且这些数据往往和DOM元素紧密相关。由于DOM元素(节点)也是对象,所以我们可以直接扩展DOM元素的属性,但是如果给DOM元素添加自定义的属性和过多的数据可能会引起内存泄漏,所以应该要尽量避免这样做。因此更好的解决方法是。
<强> jQuery引入缓存的作用强>
- <李>
允许我们在DOM元素上附加任意类型的数据,避免了循环引用的内存泄漏风险
李> <李>用于存储跟DOM节点相关的数据,包括事件,动画等
李> <李>一种低耦合的方式让DOM和缓存数据能够联系起来
李>
,
数据缓存接口
jQuery。数据(元素、关键值)
。数据()
对于jQuery。数据的方法,原文如下
<>之前,jQuery.data (), method allows us 用attach data of any type 用DOM elements 拷贝a way that is safe 得到circular references 以及therefore 得到memory 泄漏只还要set 我方表示歉意several distinct values for a single element 以及retrieve them 后:
都是用来在元素上存放数据也就平时所说的数据缓存,都返回jQuery对象,但是内部的处理确有本质的区别
我们看一组对比
& lt; div id=奥住弊4茿ron test
var aa1=$(" #亚伦");var aa2=$(" #亚伦");//=======第一组=========
<>之前). data()方法aa1.data (' a ', 1111); aa2.data (' a ', 2222); aa1.data (a),,//结果222222 aa2.data (a),,//结果222222//=======第二组=========$ . data()方法$ . data (aa1,“b”,“1111”) $ . data (aa2,“b”,“2222”) $ . data (aa1,“b”),,,//结果111111 $ . data (aa2,“b”),,,//结果222222
意外吗?,这样的细节以前是否注意到呢?
怎么通过. data()方法会覆盖前面键相同的值呢?
,
<人力资源/>对于jQuery来说,数据缓存系统本来就是为事件系统服务而分化出来的,到后来,它的事件克隆乃至后来的动画列队实现数据的存储都是离不开缓存系统,所以数据缓存也算是jQuery的一个核心基础了
早期jQuery的缓存系统是把所有数据都放美元。缓存之上,然后为每个要使用缓存系统的元素节点,文档对象与窗口对象分配一个UUID