Javascript 删除对象时,对象内部的setInterval是否阻止垃圾收集?

Javascript 删除对象时,对象内部的setInterval是否阻止垃圾收集?,javascript,garbage-collection,Javascript,Garbage Collection,我正在做一个小Websocket项目(使用Socket.io),我在其中使用了这样一个类: function myClass() { // start server sync window.setInterval(this.update.bind(this), 14); // listen for socket.io events io.on('my-event', doStuff); } myArr.splice(index, 1); myArr.spli

我正在做一个小Websocket项目(使用Socket.io),我在其中使用了这样一个类:

function myClass() {
    // start server sync
    window.setInterval(this.update.bind(this), 14);

    // listen for socket.io events
    io.on('my-event', doStuff);
}
myArr.splice(index, 1);
myArr.splice(index, 1);
该类的多个实例存储在一个数组中。 一段时间后,实例将被删除,如下所示:

function myClass() {
    // start server sync
    window.setInterval(this.update.bind(this), 14);

    // listen for socket.io events
    io.on('my-event', doStuff);
}
myArr.splice(index, 1);
myArr.splice(index, 1);
数组是唯一的位置,我将实例存储在其中,因此我认为,在将它们从数组中删除后,它们会被垃圾收集器删除

相反,我注意到它们仍然对我的websocket事件做出响应。我想知道间隔是否会阻止对象被删除,因为它绑定到窗口对象。 在删除类实例之前是否需要清除间隔


或者事件侦听器是否阻止删除该对象?

是,引用函数中的值或范围可防止其垃圾处理

事实上,从函数到对象和作用域的指针是JavaScript内存泄漏的主要原因之一,这一类中最常见的是闭包,通常与事件回调(包括该类中的计时器)有关

当您希望对象是可垃圾的时,请确保取消注册所有事件处理程序,并删除计时器(请注意,当您从DOM中删除元素时,事件处理程序将被删除,并且不保留对它的引用)

…实例会被删除,如下所示:

function myClass() {
    // start server sync
    window.setInterval(this.update.bind(this), 14);

    // listen for socket.io events
    io.on('my-event', doStuff);
}
myArr.splice(index, 1);
myArr.splice(index, 1);
…相反,我注意到他们仍然对我的websocket事件做出反应。我想知道间隔是否会阻止对象被删除,因为它绑定到窗口对象。在删除类实例之前是否需要清除间隔

是的,你需要做更多的清理工作。您需要:

  • 清除间隔,以清理与其关联的资源,并使其释放对由
    this.update.bind(this)
    创建的函数的引用(this)(this反过来又有对对象的引用,将其保留在内存中)

  • 删除所有事件侦听器(例如,web套接字事件),这将删除它们对事件处理程序函数的引用,这些函数可能有对将其保存在内存中的对象的引用

  • 确保对对象的任何其他直接或间接引用(如在任何其他绑定函数中)也已释放


感谢您指出我需要执行的步骤。一旦我完成了这些步骤,我将尽快报告。