将原型函数用作事件处理程序会导致内存泄漏吗?

时间:2018-04-19 20:02:23

标签: javascript memory-leaks garbage-collection

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事件以防止内存泄漏?

1 个答案:

答案 0 :(得分:1)

  

由于函数是在原型上定义的,所以它将永远存在(我认为)。

  

问题是该函数会阻止套接字获取GC吗?

没有。套接字对象引用该函数,而不是反过来。

  执行测试后,

套接字应立即接受GC。

是的,socket变量是,但是您创建的套接字对象(包含对处理程序的引用)仍然存在 - 它由从网络接收有效负载的内部侦听器引用。

  

我打开事件后是否需要取消订阅open事件以防止内存泄漏?

没有。您只需要在想要保持套接字打开但是停止收听时取消订阅。

但是,完成测试后,您需要关闭套接字!

相关问题