类实例重新赋值后旧实例会自动垃圾回收吗?与设为undefined有何区别?
类实例赋值与垃圾回收问题解答
旧实例是否会被自动垃圾回收?
当你多次执行this.myNewClass = new MyClass()时,旧实例能否被垃圾回收取决于是否还有其他引用指向它:
- 如果旧实例没有被任何其他对象(比如全局变量、DOM元素、事件监听器的回调函数等)持有引用,那么当
this.myNewClass指向新实例后,旧实例就会成为垃圾回收的目标,最终被回收。 - 但你的类内部包含监听器,如果这些监听器绑定到了不会被回收的对象上(比如
window、某个一直存在的DOM节点),并且监听器的回调函数保留了对旧实例的引用(比如用this指向实例),那旧实例会因为这个引用一直存在,无法被垃圾回收,对应的监听器也会持续运行。
这种情况下,你需要在替换实例前手动清理旧实例的监听器(比如调用实例内部的removeEventListener方法),才能确保旧实例能被正常回收。
重新赋值新实例与设为undefined的效果是否相同?
在切断对旧实例的引用这个核心作用上,两者效果是一致的:不管是把this.myNewClass赋值为新实例,还是设为undefined,都会让该变量不再指向旧实例。
但两者有细微区别:
- 赋值新实例后,
this.myNewClass会指向一个全新的MyClass实例,变量处于有值状态。 - 设为
undefined后,this.myNewClass不再指向任何对象,变量处于无值状态。
但要注意:如果旧实例存在其他外部引用(比如前面说的监听器绑定的对象持有引用),不管用哪种方式,旧实例都无法被垃圾回收,监听器依然会运行。
内容的提问来源于stack exchange,提问作者sir-haver
相关产品推荐
相关产品推荐

