Appearance
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 同样可以解释。
TODO:列举一些闭包的例子。 ↩︎