闭包的定义
闭包是指函数能够记住并访问其词法作用域,即使函数在其词法作用域之外执行。
简单说:函数 + 其词法环境 = 闭包
形成数据的私有化
🔍 闭包的形成原理
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可以被回收
};
}