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

为何JavaScript垃圾回收器不清理未被引用的全局变量?

JavaScript全局变量内存回收的疑问解答

首先得明确两个核心逻辑:

  • 全局作用域的生命周期和程序完全绑定:浏览器里是从窗口打开到关闭,Node.js里是进程启动到退出,所以全局作用域本身确实不会被垃圾回收器清理,它是整个代码执行的根环境。
  • 全局变量的回收与否要看引用链状态:
    • 用var声明的全局变量,会自动成为全局对象(浏览器是window,Node.js是globalThis)的属性,而全局对象始终存在,相当于这个变量一直被全局对象持有引用,所以绝对不会被回收。
    • 用let/const声明的全局变量,不会挂载到全局对象上,只存在于全局作用域的环境记录中。如果这个变量在程序任何位置(包括闭包、其他模块)都没有被引用,现代JS引擎(比如V8)理论上可以对其做惰性回收,但实际场景中这种情况很少触发——因为全局作用域一直存活,引擎做这个优化的收益低,反而会增加垃圾回收的开销。
    • 另外,ES模块里的变量不属于传统全局作用域,当模块不再被任何地方引用时,模块内的变量是可以被回收的,但这和你说的全局作用域不是一回事。

简单总结:文章说“全局作用域对象不会被清理”是正确的,但全局变量能否被回收,关键看有没有引用链指向它——被全局对象持有的全局变量(比如var声明的)肯定不会被回收;无额外引用的let/const全局变量理论上可回收,但实际中引擎很少执行这类优化。

内容的提问来源于stack exchange,提问作者Abdulrahman Ismael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:37:34