JS闭包中调用inst()后,innerVal是否会被GC回收?
闭包中innerVal是否会被垃圾回收?
以下是我编写的闭包函数:
function closure() {let innerVal; return function() {innerVal = innerVal+10}} let inst = closure(); inst(); console.log('end');
请问调用inst()后,innerVal会被垃圾回收(GC)清除吗?
回答:
调用inst()之后,innerVal不会被垃圾回收,核心原因如下:
- 变量
inst始终持有对closure()返回的内部函数的引用,而这个内部函数形成了闭包,会持续保留对closure()函数作用域的引用,innerVal就存在于这个作用域中。 - 只要
inst变量没有被显式销毁(比如赋值为null)或者未脱离当前生效的作用域,闭包绑定的作用域就不会被垃圾回收机制标记为可回收,innerVal自然也会留在内存中。 - 哪怕只调用一次
inst(),只要inst还存在,闭包作用域就会被持续保留,此时innerVal的值为NaN(因为初始未赋值的innerVal是undefined,执行undefined + 10得到NaN),该值会一直存在于内存里。
内容的提问来源于stack exchange,提问作者Bad Code
相关产品推荐
相关产品推荐

