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;

将 func() 分配给 DOM 事件处理程序会阻止 GC 收集整个对象吗?

4

1 回答 1

0

是的。阅读这个关于 gc 如何在 JavaScript 中工作的优秀答案。在您的情况下,o它仍然在全局或闭包范围内可用,因此不会被收集。它仍然可用于该功能,尽管可能无法使用。

BTW:循环引用没有问题

于 2012-05-24T19:15:23.817 回答