我已阅读了为什么它是更好的和它是如何实现的 。 但我真的不明白的是,它是如何打破循环引用? 。
它是如何打破参考圆?
$(div1).data('item', div2);
$(div2).data('item', div1);
像例如,上述指向彼此的div,它是如何防止? 我有一种预感,但我只是想知道,如果我的预感是正确的。
我已阅读了为什么它是更好的和它是如何实现的 。 但我真的不明白的是,它是如何打破循环引用? 。
它是如何打破参考圆?
$(div1).data('item', div2);
$(div2).data('item', div1);
像例如,上述指向彼此的div,它是如何防止? 我有一种预感,但我只是想知道,如果我的预感是正确的。
循环引用问题发生在一些浏览器,当你把一个引用DOM对象DOM对象上为DOM对象上的属性。 然后,你有指向对方2个DOM对象。 删除DOM对象上有一个自定义属性不会清除自定义属性。 垃圾收集器是不是聪明不知道这DOM参考不计,因此卡住,有几种方法,这可能会导致泄漏。
.data()
因为解决了这个问题.data()
的数据不是DOM对象。 这只是可以与DOM对象通过唯一的字符串ID相关联的一个JavaScript数据结构。
在一个混乱的这部分是,当你与阅读.data("key")
和key
不是在JavaScript中.data()
的数据结构,那么只有到那时,jQuery将寻找对DOM属性所谓的对象"data-key"
。 但每当你写.data("key", "myData")
它永远不会写入到DOM对象,只有给JavaScript数据结构。
因此,由于.data()
从不将数据写入到DOM对象,不能有任何这些类型的循环引用的一些浏览器有麻烦。
还有一些其他有用的东西了解的.data()
的数据结构。 当您使用jQuery的.remove()
删除从DOM元素或当你调用$(elem).html("new html")
,jQuery的清除.data()
上卸下的所有项目的数据。 这是一个情况下它的好不要jQuery的与普通的JavaScript混合。 如果您使用.data()
那么你应该总是使用jQuery的功能,因此从DOM中删除的项目.data()
进行适当清理。 否则,你可以得到内存泄漏这种方式(无论是.data()
数据可能会泄漏,并且在所引用的任何去除DOM对象.data()
可以泄漏。但是,如果你只使用jQuery方法从DOM删除项目(包括的innerHTML的更换),则jQuery将适当地清理东西并且将有没有泄漏。
因此,举例来说,这将创建一个内存泄漏:
// suppose elem is a DOM element reference
// store some data in jQuery's data storage on behalf of a DOM element
$(elem).data("someKey", "someValue");
// remove DOM element with plain Javascript
elem.parentNode.removeChild(elem);
因为你删除与普通的JavaScript的DOM元素,jQuery的没有一个机会来清理你以前存储的数据。 DOM元素本身会被垃圾收集,但是.data()
你以前存储的值现在孤儿在jQuery的存储和本质上是一个“泄漏”,因为它可能永远不会被清除。 在另一方面,如果你这样做:
$(elem).data("someKey", "someValue");
$(elem).remove();
然后,jQuery将看到您删除的DOM元素,也将清除您存储的数据.data()
一个相当简单的方法,看看它是如何工作是创建一对夫妇行的脚本使用jQuery的非最小化版本,然后刚刚经历一个呼叫步骤$(elem).data("key", "whatever")
在调试器,看它如何工作的。