【问题标题】:Event Handler Assignment and Memory Leaks事件处理程序分配和内存泄漏
【发布时间】:2012-05-31 09:45:02
【问题描述】:

我了解 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 收集整个对象吗?

【问题讨论】:

  • 这可能取决于引擎。由于func 关闭o,它确实可以访问它。不过,有些引擎可能会认识到它无法访问o
  • 据我所知,它曾经发生在早期版本的 IE 中......而且你必须引用一个 html 元素,它引用一个 JS 对象,它引用同一个 html 元素( ?)...我不确定最后一个... =)
  • 其实我是故意的。虽然在这样一个简短的示例中可能看起来很愚蠢,但在我多次引用同一个元素的长代码段中,为了易读性和效率,我会将它分配给一个变量。此策略基于 GC 在我完成时收集变量,因为它仅用于对 DOM 进行分配,而不会被任何其他对象引用。如果这是一个不正确的陈述,我很想知道......

标签: javascript


【解决方案1】:

是的。阅读this excellent answer,了解 gc 在 JavaScript 中的工作原理。在您的情况下,o 在全局或闭包范围内仍然可用,因此不会被收集。它仍然可用于该功能,但可能不会使用。

顺便说一句:有no problem with circular references

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 2012-10-29
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多