Chr*_*ini 6 jquery uuid expando
在底层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(如果不存在) - 理想情况下,该方法是从中分解的,$.data()并为传入的标记创建或获取uuid.
那么,有没有一个原因在jQuery中没有考虑到它自己的方法?这在某种程度上有害吗?它只是从来没有看似有用的东西吗?
我应该注意到,我实际上已经在我们正在使用的jQuery版本中考虑了它,并且它非常有用.但也许存在潜在的风险,我没有打算使用它.我也知道一个插件可以实现这一点,但它有点破碎 - 并且有两个代码路径来执行相同的UUID功能既有点浪费又有点脆弱.
我认为这里明显的答案是 jQuery 构建了他们的 uuid 供内部使用,并且没有看到一个很好的理由或很大的需求来费心让它公开使用。这并不意味着原因不存在,只是它们似乎还不够重要,不足以使其成为需要处理的事情的首要任务。
用作唯一 ID 的单调递增计数器实现起来非常简单,我已经使用过很多次了。我觉得我不需要类库支持来做到这一点。
我认为你对内存泄漏的恐惧是因为你保留了对象引用有点过分了。首先,如果您删除该对象并忘记删除对其的某些引用,那么这只是内存泄漏。这只是垃圾收集语言中的一般规则,您必须“知道”在哪里保存对可以删除的对象的引用,并在您打算释放对象时清理这些引用。
其次,只有当您在每个页面上多次执行相同的操作或者对象非常非常大时,才会出现有意义的内存泄漏。当您进入下一页时,它们都会被清理掉,因此它不会永远累积,除非您永远不会离开该浏览器页面并一遍又一遍地执行相同的操作,其中涉及已删除的对象,但未删除的引用。
第三,jQuery 的 .data() 机制尝试在使用 DOM 对象时为您解决很多问题。
第四,在您设计的示例中,这不会造成内存泄漏,除非您在状态 2 中的图标数组不再有效或不再使用时不清理它。如果你清理它,那么在该数组中存储直接 DOM 引用就没有问题了。如果你不清理数组,那么即使数组本身也是内存泄漏,即使它里面有抽象的 uuid 而不是 DOM 引用。大多数时候,使用抽象引用只是比需要的工作多得多。
同样,即使发生泄漏,只有当页面寿命很长并且您重复创建和释放对象,但没有以引用随着时间累积的方式清除对它们的所有引用并执行此操作时,泄漏才很重要足以证明它们引起的内存泄漏是有意义的。我一直在 JS 变量中保留对 DOM 对象的引用。我只是小心地确保当我不再需要它们时将它们清空,这样我就知道 DOM 对象可以在将来的某个时候被释放。