执行完成,但是没有被销毁的函数作用域

  • 即已经出栈,但是没有销毁的执行上下文,栈内存中一块私有的空间

形成原因

  • 函数执行完成后,其执行上下文出栈。
  • 但是因为某些原因,导致其内部变量还存在引用(如导出了一个操作内部变量的函数)
  • 因此该上下文就不会立刻销毁,会一致存在于栈内存中,直到那个引用消失
  • 由于作用域的访问机制,外部无法直接操作闭包的内部,就形成了一个私密的空间

示例

https://juejin.im/post/5c0d0d9e6fb9a04a03790a76#heading-2
https://limeii.github.io/2019/05/js-closures/

  1. const a = 1
  2. function foo () {
  3. console.log(a)
  4. }
  5. foo()
  • foo函数访问了变量a,但a不是foo函数的局部变量,也不是foo函数的参数,所以a是自由变量,foo是闭包

函数声明时,会创建[[scopes]]属性,并将当前执行栈中所有上下文的词法环境记录按照顺序压入其中
一个函数创建它的上下文已经销毁,但它依然存在,并且在代码访问了自由变量
为什么还能够访问自由变量
那个上下文虽然出栈销毁了,但是因为闭包的[[scopes]]属性还关联着它的词法环境记录,因此这个词法环境记录还会活在内存中,并且只能是这个闭包访问(因为只有这个闭包的作用域链能查找到)