【问题标题】:Should you dispose of jQuery objects?你应该处理 jQuery 对象吗?
【发布时间】:2012-01-05 09:03:39
【问题描述】:

我的一个同事总是将他们的 jQuery 变量设置为 null,以便在完成后有效地处理它们,例如:

var bigThing = $(body);
// ...
// Do some stuff
// ...
bigThing = null;

真的有必要吗?

【问题讨论】:

标签: javascript jquery memory-management


【解决方案1】:

如果您将代码封装成不必要的函数,因为在函数完成后,当在其他地方没有使用它们的引用时,无论如何都会杀死局部变量。

如果您需要一遍又一遍地选择相同的东西而不是只选择一次并保留变量,那么保持选择器/变量(缓存)可能会产生一些积极的影响。

【讨论】:

    【解决方案2】:

    简短回答:不,如果您使用 jQuery,那几乎没有必要。

    这取决于你用它做了什么。如果您没有将任何事件处理程序附加到 DOM 节点,则垃圾收集器将在不再引用它时将其清除。

    但是,即使您确实附加了事件处理程序,jQuery 也会通过为您分离所有事件处理程序,在 .remove().empty() 等函数中处理它们。所以只要你使用 jQuery 与 DOM 交互,你就安全了。

    如果没有 jQuery,如果您已将事件处理程序附加到节点,GC 不会清除它,即使您已从 DOM 树中删除节点并且您不再有任何对它的引用。这是因为 DOM 节点包含对 JavaScript 对象(即事件处理程序)的引用,反之亦然。这会创建一个跨两个独立系统的循环引用;大多数垃圾收集器都遇到了麻烦。

    为了进一步阅读,我将您指向Douglas Crockford's article on Memory Leaks

    【讨论】:

      【解决方案3】:

      删除引用并释放内存不是必须的,而是好习惯

      【讨论】:

        【解决方案4】:

        虽然不是完全必要,但可以这样做以确保 GC 在下一次运行中将其清除(无论如何它都会对您甚至没有 1 个引用的所有分配执行此操作)。

        不过,在您的示例中,如果您将 bigThing 设置为其他任何值(不一定为 null),则 $(body) 对象(jquery 扩展对象,而不是 DOM 主体对象)将被清除

        【讨论】:

          【解决方案5】:

          Javascript 有自己的垃圾收集器。因此,您似乎不需要显式处置对象。

          但是由于各种原因,比如垃圾收集器的实现不好等,可能会发生一些内存泄漏。

          通过显式取消它们,您可以向浏览器指定在下一次垃圾回收中必须清除此内存。

          总之,虽然没有必要这样做,但将 JQuery/javascript 对象无效化将是一个好习惯。

          【讨论】:

          • 我认为“使对象无效”是用词不当。您肯定会使变量无效;该对象只是被取消引用。
          猜你喜欢
          • 2021-08-23
          • 1970-01-01
          • 2023-03-18
          • 2012-04-11
          • 1970-01-01
          • 1970-01-01
          • 2019-10-13
          • 2016-09-05
          • 1970-01-01
          相关资源
          最近更新 更多