You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类实例重新赋值后旧实例会自动垃圾回收吗?与设为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:35:22