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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:01