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();
执行测试后,套接字应该直接接受GC。但它有一个onopen处理程序,它包含对套接字对象的引用。
由于函数是在原型上定义的,因此它将永远存在(我认为)。问题是该函数会阻止套接字获取GCed。
即。在打开事件后,是否需要取消订阅open事件以防止内存泄漏?
答案 0 :(得分:1)
由于函数是在原型上定义的,所以它将永远存在(我认为)。
是
问题是该函数会阻止套接字获取GC吗?
没有。套接字对象引用该函数,而不是反过来。
执行测试后,套接字应立即接受GC。
是的,socket
变量是,但是您创建的套接字对象(包含对处理程序的引用)仍然存在 - 它由从网络接收有效负载的内部侦听器引用。
我打开事件后是否需要取消订阅open事件以防止内存泄漏?
没有。您只需要在想要保持套接字打开但是停止收听时取消订阅。
但是,完成测试后,您需要关闭套接字!