JS中实现析构函数的最佳方法

时间:2019-03-06 02:54:01

标签: javascript garbage-collection

考虑以下代码

class Hello {
    constructor(name) {
        this.interval = setInterval(() => {
            console.log('===', name)
        }, 1000)
    }
    destroy() {
        clearInterval(this.interval)
    }
}
let h = new Hello('aaa')
// h.destory()
h = new Hello('bbb')

如果构造函数分配了一些资源,则在哪里释放资源? 据我目前的了解,当h被重新分配给new Hello('bbb')到内存new Hello('aaa')时,应该由GC释放。

newdestroy应该成对使用是一个好习惯吗?

1 个答案:

答案 0 :(得分:-1)

不幸的是(我相信)没有办法捕获对象的垃圾回收来执行某些操作。相反,您需要通过明确显示创建/删除内容来构建自己的管理,以清理计时器等资源。我知道您的示例是一个玩具,但是您不能简单地按照显示的方式重新分配。您需要执行以下操作:

const objects = {}

const createObject = name => {
  const obj = new Hello(name)
  objects[name] = obj
  return obj
}

const deleteObject = name => {
  objects[name].destroy()
  delete objects[name]
}

let h = createObject('aaa')
deleteObject('aaa') // interval cleared but not gc'd because of h
h = createObject('bbb') // all references to aaa now gone

显然,这是一个简单的示例,并且将根据您的需要提供更优雅的方法,但希望您能想到。