执行完成,但是没有被销毁的函数作用域
- 即已经出栈,但是没有销毁的执行上下文,栈内存中一块私有的空间
形成原因
- 函数执行完成后,其执行上下文出栈。
- 但是因为某些原因,导致其内部变量还存在引用(如导出了一个操作内部变量的函数)
- 因此该上下文就不会立刻销毁,会一致存在于栈内存中,直到那个引用消失
- 由于作用域的访问机制,外部无法直接操作闭包的内部,就形成了一个私密的空间
示例
https://juejin.im/post/5c0d0d9e6fb9a04a03790a76#heading-2
https://limeii.github.io/2019/05/js-closures/
const a = 1function foo () {console.log(a)}foo()
- foo函数访问了变量a,但a不是foo函数的局部变量,也不是foo函数的参数,所以a是自由变量,foo是闭包
函数声明时,会创建[[scopes]]属性,并将当前执行栈中所有上下文的词法环境记录按照顺序压入其中
一个函数创建它的上下文已经销毁,但它依然存在,并且在代码访问了自由变量
为什么还能够访问自由变量
那个上下文虽然出栈销毁了,但是因为闭包的[[scopes]]属性还关联着它的词法环境记录,因此这个词法环境记录还会活在内存中,并且只能是这个闭包访问(因为只有这个闭包的作用域链能查找到)
