闭包

闭包

_

 闭包的定义

闭包是指函数能够记住并访问其词法作用域,即使函数在其词法作用域之外执行。

简单说:函数 + 其词法环境 = 闭包

形成数据的私有化

🔍 闭包的形成原理

1. 词法作用域

function outer() {
  let outerVar = '外部变量';
  
  function inner() {
    console.log(outerVar); // 能访问外部变量
  }
  
  return inner;
}

const closureFunc = outer(); // 形成闭包
closureFunc(); // 输出: '外部变量'

2. 作用域链

当内部函数访问外部变量时,JavaScript会沿着作用域链向上查找,即使外部函数已经执行完毕。

⚠️ 闭包的优缺点

优点

  • ✅ 数据封装:创建私有变量

  • ✅ 状态保持:函数间共享状态

  • ✅ 函数工厂:动态创建函数

  • ✅ 模块化:实现模块模式

缺点

  • ❌ 内存占用:闭包会阻止垃圾回收

  • ❌ 性能影响:可能造成内存泄漏

  • ❌ 调试困难:作用域链复杂

内存管理建议

及时释放引用 合理使用,避免内存泄漏

// ❌ 可能导致内存泄漏
function createLeak() {
  const largeData = new Array(1000000).fill('data');
  
  return function() {
    // 闭包引用largeData,无法回收
    console.log(largeData.length);
  };
}

// ✅ 及时释放引用
function createBetterClosure() {
  const largeData = new Array(1000000).fill('data');
  const length = largeData.length; // 只保存需要的值
  
  return function() {
    console.log(length); // 不引用大对象
    // largeData可以被回收
  };
}

在 TypeScript 中,type 和 interface 的区别 2025-10-10
JavaScript中undefined与null的区别详解 2025-08-14

评论区