javascript - 使用原型(prototype)函数作为事件处理程序会导致内存泄漏吗?

标签 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();

socket 应在测试执行后立即接受 GC。但它有一个 onopen 处理程序,并且保存对套接字对象的引用。

由于该函数是在原型(prototype)上定义的,因此它将永远存在(我认为)。问题是该函数是否会阻止套接字被垃圾回收。

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

最佳答案

Since the function is defined on the prototype so it will live forever (I think).

是的。

The question is will that function prevent socket from getting GCed?

没有。套接字对象正在引用该函数,而不是相反。

socket should be subject to GC right after test is executed.

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

Do I need to unsubscribe to the open event after its opened to prevent memory leak?

没有。仅当您想要保持套接字打开但停止监听时,才需要取消订阅。

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

关于javascript - 使用原型(prototype)函数作为事件处理程序会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929326/

相关文章:

java - Java 应用程序中奇怪的网络套接字泄漏

c# - C# WPF 中的内存泄漏

javascript - Excel - json数据 - 将某些元素返回到相邻单元格公式/宏

javascript - 从对象的 Knockout observableArray 的第 n 个索引中提取特定字段

android - 我在 Android 中使用 ListActivity 时发生内存泄漏

java - 使用 JNA 的 Memory 类是否存在内存泄漏问题?

javascript - 如何在禁用下拉菜单后启用它?

javascript - 如何通过单一方法从不同索引的数组中删除元素?

c# - 缓存字符串需要担心吗?

javascript - Node JS进程内存不足