闭包对执行上下文的保留层级最多可达多少层?
闭包嵌套场景下的上下文保留问题
结论
- 内层函数被返回时不会无差别保留所有嵌套祖先的完整执行上下文,仅会保留自身实际引用到的、上级作用域内的变量关联的上下文片段,未被引用的上级作用域变量会被JS引擎的垃圾回收机制正常回收,不会占用额外内存。
示例说明
你给出的多层嵌套函数代码如下:
const a = function() { const aa = 'aa'; return function() { const bb = 'bb'; return function() { return aa; } } }
按照a()()()的方式调用后返回aa,本质是最内层函数明确引用了第一层函数作用域中的aa变量,因此该变量对应的上下文片段会被持续保留,直到最内层函数本身被销毁。
在这个示例中,最内层函数没有引用第二层函数作用域内的bb变量,因此第二层函数执行完成后,bb会被垃圾回收,不会被保留在最内层函数的上下文链中。
如果调整最内层函数的逻辑,同时引用aa和bb:
return function() { return aa + bb; }
那么两个变量对应的上级上下文片段都会被保留,不会被回收。
内容的提问来源于stack exchange,提问作者Daud
相关产品推荐
相关产品推荐

