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

闭包如何在父函数执行上下文出栈后保留其变量引用?

问题解答

首先纠正一个关键误解:变量a并不是存储在执行上下文的栈结构中,而是属于x函数的词法环境(Lexical Environment)。这是理解闭包的核心。

具体原因拆解:

  • 当x执行时,会创建一个专属的词法环境,里面包含了let a=1这个变量绑定。这个词法环境和x的执行上下文关联,但栈中仅保存执行上下文的引用,变量实际存储在词法环境里。
  • 函数y在x内部定义时,会自动捕获它所在的词法环境(也就是x的词法环境),这个引用会被保存在y的内部属性中——相当于y"记住"了自己诞生时的环境。
  • 当x执行完毕,它的执行上下文会被弹出调用栈,但因为y(也就是赋值后的d)还持有对x词法环境的引用,JavaScript的垃圾回收机制不会回收这个词法环境,所以a依然存在于内存中。
  • 后续只要调用d(),y就会通过之前捕获的词法环境找到a,自然能输出1。

简单说,这就是闭包的本质:内部函数保留对外部函数词法环境的引用,即使外部函数的执行上下文已销毁,该词法环境依然会被保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:23:12