闭包是指函数能记住并访问其定义时的词法作用域,即使该函数在作用域外执行。实际应用场景:
- 数据私有化:用模块模式创建私有变量,只暴露受控接口;
- 函数工厂 / 柯里化:预置参数生成新函数,如
const add = x => y => x + y; - 防抖节流:用闭包保存定时器 ID 和上次执行时间等状态;
- 记忆化(memoize):缓存计算结果,键值存在闭包变量里;
- 回调中保持状态:如循环中保存每次迭代的值(配合
let或 IIFE); - 一次性函数:记录是否已执行过。
function counter() {
let n = 0; // 外部无法直接访问
return () => ++n;
}
const next = counter();
next(); // 1
next(); // 2
易错点:闭包引用的变量不会被回收,长期持有大对象或 DOM 引用可能造成内存泄漏。追问:闭包与作用域链的关系、V8 中闭包变量的存储(堆分配)。