JavaScript中的闭包何时会被销毁回收?
JavaScript闭包的销毁与回收机制解答
示例代码
let inner; function outerFunction() { let outerValue = 'Mike' function innerFunction() { let message = `${outerValue} is a developer` console.log(message) // Mike is a developer } inner = innerFunction; return } outerFunction() inner()
问题解答
1. innerFunction何时会从调用栈中移除?
调用栈存储的是正在执行的函数的执行上下文,和函数是否有return语句没有关联。调用inner()时,innerFunction的执行上下文会被压入调用栈,当它内部的所有逻辑(模板字符串拼接、console.log执行)全部运行完成后,执行上下文会立刻从调用栈中弹出移除。
2. innerFunction会在outerFunction return时就被销毁吗?
不会。你在outerFunction执行时,把innerFunction的引用赋值给了全局作用域下的inner变量,只要inner还持有这个引用,JavaScript的垃圾回收机制就不会销毁innerFunction本身,也不会销毁它闭包捕获的outerValue变量。
outerFunction执行完成return后,它自己的执行上下文会从调用栈弹出,但它的活动对象中被闭包引用的部分会被保留在堆内存中,不会被回收。
3. 一直驻留内存会造成严重的内存浪费吗?
分场景判断:
- 如果你后续还需要调用
inner(),这属于闭包的正常使用场景,不属于内存浪费,是符合预期的语言特性。 - 如果你后续不再需要使用
inner,但没有主动释放引用(比如没有执行inner = null),那么innerFunction和它捕获的变量会一直占用内存,属于不必要的资源占用。如果闭包捕获的是体积很大的对象、且长期持有无用引用,才会造成明显的内存问题,普通小变量的占用几乎可以忽略。
闭包的回收时机
当所有持有innerFunction引用的变量都被释放时(比如手动执行inner = null,或者持有引用的变量本身被销毁,比如局部变量超出作用域),innerFunction和它捕获的闭包变量就没有任何可达引用了,下一次垃圾回收运行时,会把它们统一回收释放内存。
内容的提问来源于stack exchange,提问作者GoonGamja
相关产品推荐
相关产品推荐

