Skip to content

1. 闭包 ​

难度等级:🟡 中级 分类:JavaScript 归档日期:2026-10-20


广义上说,闭包就是函数和函数创建时所在的词法环境的组合。所以从技术角度讲,任何一个 JavaScript 函数都是闭包。

我们常说的闭包,一种典型情况是[1]:一个函数作为另一个函数的返回值被返回,而这个返回的函数依然引用着外层函数的变量。即使外层函数已经执行完毕,只要内层函数还被引用着,外层的环境记录就不会被回收。

从 JS 引擎的机制上说,准确地说是 V8 引擎(其他引擎我不确定):同一个函数里的多个闭包会共享同一个 Context 对象,它存放在堆内存上。所以有时候一个闭包引用了大对象,会连带着整个 Context 都释放不掉。

javascript
var a = 1;
function foo() {
  console.log(a);
  var a = 2;
}
foo(); // undefined

执行 foo 时,当前执行上下文里的 a 已经因为变量提升被初始化为 undefined,在当前环境中就能找到,所以不会再通过 [[OuterEnv]](指向外层 [[Environment]] 的引用)去外部查找。

用 ES3 的 VO、AO 同样可以解释。


  1. TODO:列举一些闭包的例子。 ↩︎

个人面试题归档,持续更新中