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

JavaScript中垃圾回收器与闭包疑问:为何var a=7未被回收?

闭包为啥会阻止变量被垃圾回收?

垃圾回收是JavaScript的核心特性,专门用来自动清理程序里不再被使用的无用值,释放内存。但很多人会纳闷:用闭包的时候,为啥有些看起来没用的变量没被回收?

咱们拿你给的代码来拆解:

function x() {  
  var a = 7;     
  function y() {     
    console.log(a);   
  }   
  return y; 
} 
var z = x(); 
console.log(z); 
z();  

关键原因:变量还被闭包攥着引用呢

函数x执行完之后,正常来说它内部的局部变量会因为没人引用了,被垃圾回收器标成可回收的。但这里不一样:

  • 内部函数y形成了闭包,它一直保留着访问x作用域的权限
  • x执行完返回了y,而且这个返回值被赋值给了全局变量z——这就意味着y本身根本没被销毁
  • 既然y一直拿着x作用域里a的引用,垃圾回收器就会判定a还在被使用,自然不会回收它

闭包和垃圾回收其实是协同工作的

别以为它们对着干,其实是配合的:只有当闭包本身也没人引用的时候(比如你执行z = null,把对y的引用切断),y还有它引用的a才会被标成可回收,这时候垃圾回收器才会释放这部分内存。

内容的提问来源于stack exchange,提问作者Toufiq Choudhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:45:41