闭包如何在父函数执行上下文出栈后保留其变量引用?
问题解答
首先纠正一个关键误解:变量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
相关产品推荐
相关产品推荐

