概念:闭包就是能够读取其他函数内部变量的函数。

三大特性:

优点:

缺点:

解决: 将函数设置为 Null

补充

补充:闭包(closure)= 函数 + 函数能够访问的外部变量(自由变量)。当函数引用了它词法作用域之外的变量,且该函数在其定义的作用域之外被调用时,就形成了闭包。

优点:

  1. 延长局部变量的生命周期,可在函数外读取/修改函数内部变量;
  2. 用于封装私有变量(模块化早期方案 IIFE);
  3. 偏函数、柯里化、防抖节流等函数式编程都依赖闭包。

缺点:

  1. 被引用的变量会常驻内存,不会被 GC 回收,滥用会导致内存泄漏;
  2. 闭包共享同一个外部变量时,所有调用看到的都是同一个值,容易出错(用 IIFE / block scope 解决)。

释放:将引用闭包的变量置为 null,让 GC 可以回收;或在页面销毁时(组件 unmount 时)统一清理。

function counter() {
  let n = 0
  return function () {
    return ++n
  }
}
const inc = counter()
inc() // 1
inc() // 2

来源整理自:vue3js.cn 面试官系列