【发布时间】:2011-10-25 09:34:18
【问题描述】:
在底层,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 功能。您可以通过调用$.data(tag, 'irrelevant', 1) 让JQuery 将UUID 隐式附加到标签,然后检查tag[jQuery.expando] 以获取其UUID,最后在列表中使用它......但这有点小技巧。真正理想的是在公共 API 中公开以下内容:
$.getUuid(tag):如果不存在 UUID,则检查并创建 UUID - 理想情况下,该方法从 $.data() 中分解出来,并为传入的标签创建或获取 uuid。
那么,这是否有原因在 jQuery 中没有被考虑到它自己的方法中?这在某种程度上有害吗?它只是从来没有看起来有用的东西吗?
我应该注意,我实际上已经在我们使用的 jQuery 版本中考虑了它,它非常有帮助。但也许我在使用中没有遇到潜在的风险。我也知道有一个插件可以实现这一点,但它有点损坏 - 并且有 2 个代码路径来执行相同的 UUID 功能既有点浪费又有点脆弱。
【问题讨论】:
-
我认为这是一个很好的问题,但将其通过电子邮件发送给 jQuery 维护人员可能更有效 :-) 或者,记录一个错误 - 他们确实非常重视错误列表。跨度>
-
我认为他们必须先重命名该功能,然后才能将其暴露给外界:顺序整数除了通用唯一标识符之外的一切。
-
@Pointy 好的,我会这样做 - 我真的很感谢更广泛的 Stack Overflow 社区和针对此类问题的评论排名系统。
-
请注意,这是向 JQuery 团队提出的,但(非常粗鲁地)拒绝了,基本上是说,我们收到了很多请求,你自己写吧。