你应该销毁jQuery对象吗?

8

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

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

这真的必要吗?


谢谢,是的,那个问题确实非常相似,并且有一个很好的答案。 - Jay
5个回答

7
如果将您的代码封装到函数中,则在函数完成后,当没有其他地方使用它们的引用时,局部变量将被删除,因此这是不必要的。
然而,如果需要多次选择相同的内容,与仅选择一次并保留变量相比,保留选择器/变量(缓存)可能会产生一些积极影响。

3
简短回答:如果你使用jQuery,那么几乎不需要这样做。
这取决于你对它的操作。如果你没有将任何事件处理程序附加到DOM节点上,垃圾收集器会在它不再被引用时清除它。
但是,即使您附加了事件处理程序,jQuery也会在.remove().empty()等函数中为您处理它们,通过分离所有事件处理程序来保证安全。因此,只要您使用jQuery与DOM进行交互,就是安全的。
没有jQuery,如果您已将事件处理程序附加到节点上,则GC不会清除它,即使在从DOM树中删除该节点并且您不再具有任何对它的引用之后。这是因为DOM节点包含对JavaScript对象(即事件处理程序)的引用,反之亦然。这在两个单独的系统之间创建了一个循环引用;这是大多数垃圾收集器难以处理的问题。
如需进一步阅读,请参阅Douglas Crockford's article on Memory Leaks

2

尽管不是必须的,但习惯释放内存并移除引用是一个良好的实践。


0

虽然不是完全必要的,但这样做可以确保GC在下一次运行时清除它(对于您没有任何引用的所有分配,它都会这样做)。

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


0

Javascript有自己的垃圾回收器。因此,似乎不需要显式地处理对象。

但由于各种原因,例如垃圾回收器的错误实现等,可能会出现一些内存泄漏。

通过显式地将它们置为null,您可以指定给浏览器,在下一次垃圾回收时清除该内存。

总之,虽然这并非必须做的,但将JQuery / javascript对象置为null是一个好习惯。


5
我认为“作废一个对象”这个说法不准确。你当然可以作废变量;而对象只是被解除了引用关系。 - Peter-Paul van Gemerden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接