闭包是指函数能记住并访问其定义时的词法作用域,即使该函数在作用域外执行。实际应用场景:

  1. 数据私有化:用模块模式创建私有变量,只暴露受控接口;
  2. 函数工厂 / 柯里化:预置参数生成新函数,如 const add = x => y => x + y
  3. 防抖节流:用闭包保存定时器 ID 和上次执行时间等状态;
  4. 记忆化(memoize):缓存计算结果,键值存在闭包变量里;
  5. 回调中保持状态:如循环中保存每次迭代的值(配合 let 或 IIFE);
  6. 一次性函数:记录是否已执行过。
function counter() {
  let n = 0; // 外部无法直接访问
  return () => ++n;
}
const next = counter();
next(); // 1
next(); // 2

易错点:闭包引用的变量不会被回收,长期持有大对象或 DOM 引用可能造成内存泄漏。追问:闭包与作用域链的关系、V8 中闭包变量的存储(堆分配)。