在JQuery的内部,它使用一个"UUID"映射表(实际上只是一个计数器,由
jQuery.uuid
维护)来解决当你从Javascript中将属性附加到DOM标签时,浏览器已知的内存泄漏问题。作为替代方案,JQuery使用$.data(tag, name, value)
将数据存储在以uuid为键的映射中(可以通过检查tag[jQuery.expando]
确定该键)。虽然$.data()
非常有用,但有时您希望将数据映射到标签而不是将这些数据倾泻到一个全局桶中——您希望拥有自己的更小的数据桶,例如可以检查长度或循环遍历。举个例子,假设您有图标,当单击时会轮换四种状态之一。当一个图标处于状态2时,您想将其添加到状态2的图标数组中。最明显的方法是将该标签添加到数组中;但是这样做会导致内存泄漏。您可以在复选框上调用$.data()
,但这并不能完全实现您要做的事情——您必须循环遍历所有复选框,并根据它们来检查$.data()
,以确定哪些在列表中,哪些不在。您需要将标签的某些抽象内容存储在数组中,这就是JQuery的UUIDs所起的作用。您可以编写自己的UUID功能,但理想情况下,为了减小代码大小和提高质量,最好利用JQuery已经内置的UUID功能。您可以通过调用$.data(tag, 'irrelevant', 1)
来隐式地请求JQuery附加UUID到标签上,并检查tag[jQuery.expando]
来获取其UUID,最后在列表中使用该UUID...但这有点像黑客行为。实际上,最理想的情况是将以下内容公开到公共API中:$.getUuid(tag)
:检查并创建UUID(如果不存在),理想情况下,该方法应从$.data()
中分离出来,并为传入的标签创建或获取uuid。那么,为什么JQuery没有将其分解成自己的方法呢?这会有什么害处吗?还是说从未发现它有用?我应该指出,我实际上已经在我们正在使用的jQuery版本中将其分解出来了,这非常有帮助。但也许我的使用中存在潜在风险。我也知道一个插件可以实现这个功能,但它有点损坏——拥有两个执行相同UUID功能的代码路径既有点浪费,又有点脆弱。