事件处理程序分配和内存泄漏

3
我理解JavaScript中循环引用的概念以及避免它们以防止内存泄漏的重要性,但我没有找到有关将闭包或原型的成员函数分配给事件处理程序如何影响垃圾回收的任何信息。
例如,假设我编写了以下代码之一:
var o = {};
o.var = 10000000;
o.func = function() { /*Do something that does not involve o.var*/ };

function p() { }
p.prototype.var = 100000;
p.prototype.func = function () { /*Do something that does not involve p.var*/ };

...然后继续执行以下操作之一:

var div = document.getElementByID('div');
div.onclick = o.func;

var instance_of_p = new p();
var div = document.getElementByID('div');
div.onclick = instance_of_p.func;

给DOM事件处理程序分配func()函数,是否会防止整个对象被GC回收?

这可能取决于引擎。由于func关闭了o,因此它确实可以访问它。但有些引擎可能会认为它没有访问o - Felix Kling
据我所知,这在早期版本的IE中曾经发生过...而且你必须引用一个HTML元素,该元素引用一个JS对象,该JS对象又引用同一个HTML元素(?)...关于最后一个我不太确定... =) - benqus
实际上,我是有意为之的。虽然在这个简短的例子中看起来有些愚蠢,但在长段代码中,当我多次引用同一元素时,我会将其分配给一个变量,以提高可读性和效率。这种策略基于GC在我完成后收集变量,因为它仅被用于对DOM进行赋值,而不被任何其他对象引用。如果这是错误的说法,我很想知道... - MadRabbit
1个回答

0

是的。阅读这个优秀的答案,了解JavaScript中gc的工作原理。在您的情况下,o仍然可用于全局或闭包范围,因此不会被收集。它仍然可以供函数使用,尽管可能不会被使用。

顺便说一句:循环引用没有问题


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