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
相关产品推荐
相关产品推荐

