【发布时间】:2018-04-19 20:02:22
【问题描述】:
var foo = function () {
}
foo.prototype.bar = function () {
}
var test = function () {
var socket = new WebSocket("ws://localhost");
socket.onopen = foo.prototype.bar;
//Or socket.addEventListener('open', foo.prototype.bar)
}
test();
socket 应该在测试执行后立即进行 GC。但它有一个 onopen 处理程序,它持有对套接字对象的引用。
由于函数是在原型上定义的,所以它将永远存在(我认为)。问题是该功能是否会阻止套接字获得 GCed。
I.E.是否需要在打开事件后取消订阅以防止内存泄漏?
【问题讨论】:
-
如果你为
foo.prototype设置了一个特定的实例,你可以在完成后将其清空。 -
@ScottMarcus 即使我将其清空,引用仍然在原型上定义的函数上,不是吗..
-
如果你将原型清空,它就不会存在附加函数。
-
@ScottMarcus im 使用 typescript 类并且 ts 喜欢原型。我只是想知道我是否需要清除类中定义的所有事件处理程序,或者我是否可以避免内存泄漏。 (我对答案很好奇。想知道浏览器是否可以做一些魔法来避免这种情况)
-
这应该很容易测试,但我不认为这是一个问题 - 引用是从要收集的对象到原型,而不是相反。
标签: javascript memory-leaks garbage-collection