为何JavaScript垃圾回收器不清理未被引用的全局变量?
JavaScript全局变量内存回收的疑问解答
首先得明确两个核心逻辑:
- 全局作用域的生命周期和程序完全绑定:浏览器里是从窗口打开到关闭,Node.js里是进程启动到退出,所以全局作用域本身确实不会被垃圾回收器清理,它是整个代码执行的根环境。
- 全局变量的回收与否要看引用链状态:
- 用
var声明的全局变量,会自动成为全局对象(浏览器是window,Node.js是globalThis)的属性,而全局对象始终存在,相当于这个变量一直被全局对象持有引用,所以绝对不会被回收。 - 用
let/const声明的全局变量,不会挂载到全局对象上,只存在于全局作用域的环境记录中。如果这个变量在程序任何位置(包括闭包、其他模块)都没有被引用,现代JS引擎(比如V8)理论上可以对其做惰性回收,但实际场景中这种情况很少触发——因为全局作用域一直存活,引擎做这个优化的收益低,反而会增加垃圾回收的开销。 - 另外,ES模块里的变量不属于传统全局作用域,当模块不再被任何地方引用时,模块内的变量是可以被回收的,但这和你说的全局作用域不是一回事。
- 用
简单总结:文章说“全局作用域对象不会被清理”是正确的,但全局变量能否被回收,关键看有没有引用链指向它——被全局对象持有的全局变量(比如var声明的)肯定不会被回收;无额外引用的let/const全局变量理论上可回收,但实际中引擎很少执行这类优化。
内容的提问来源于stack exchange,提问作者Abdulrahman Ismael
相关产品推荐
相关产品推荐

