在底层,JQuery 使用“UUID”的映射(只是它维护的一个计数器jQuery.uuid
)来解决浏览器在从 Javascript 将属性附加到 DOM 中的标记时出现的众所周知的内存泄漏问题。代替这样做,JQuery 使用$.data(tag, name, value)
将数据存储在与 uuid 键控的映射中(可以通过检查来确定的键tag[jQuery.expando]
)。
虽然$.data()
非常有用,但有时您希望将数据映射到标签而不将该数据转储到一个全局存储桶中 - 您需要自己的较小数据存储桶,例如,检查长度或循环。
作为一个人为的示例,假设您的图标在单击时会在 4 种状态之一中旋转。当一个处于状态 2 时,您希望将其添加到状态 2 的图标数组中。最明显的方法是将标签添加到数组中;但是这样做会造成内存泄漏。您可以调用$.data()
复选框,但这并不能完全完成您想要做的事情 - 您必须遍历所有复选框,检查$.data()
它们以确定哪些在列表中,哪些不在列表中。
您需要将标签的一些抽象存储在一个数组中,这就是 jQuery 的 UUID。您可以编写自己的 UUID 功能,但理想情况下,出于代码大小和质量原因,您只需利用 JQuery 已经内置的 UUID 功能。您可以要求 JQuery 通过调用隐式地将 UUID 附加到标签上$.data(tag, 'irrelevant', 1)
,然后检查tag[jQuery.expando]
以获取其 UUID,最后在列表中使用它......但这有点小技巧。真正理想的是在公共 API 中公开以下内容:
$.getUuid(tag)
: 如果不存在 UUID,则检查并创建一个 UUID - 理想情况下,该方法被分解$.data()
并创建或获取传入标签的 uuid。
那么,这是否有原因在 jQuery 中没有被考虑到它自己的方法中?这在某种程度上有害吗?它只是从来没有看起来有用的东西吗?
我应该注意,我实际上已经在我们使用的 jQuery 版本中考虑了它,它非常有帮助。但也许我在使用中没有遇到潜在的风险。我也知道有一个插件可以实现这一点,但它有点坏了——并且有 2 个代码路径来执行相同的 UUID 功能既有点浪费又有点脆弱。