闭包(Closure)是指一个函数能够访问其外部函数作用域中的变量,即使外部函数已经执行完毕(这个很重要)。闭包常用于数据封装和保持变量的持久化。
闭包的作用
- 数据私有化(避免全局变量污染)
- 创建一个持久的作用域(数据不会被垃圾回收)
- 实现封装和模块化(常用于计数器、缓存、事件监听等)
示例 1:计数器
function createCounter() {
let count = 0; // count 变量被封装在闭包内
return function() {
count++;
console.log(count);
};
}
const counter = createCounter();// ⚠️这里createCounter()把内部函数返回了, 自己是不执行的了,但是他的定义的变量还能被访问 这就是闭包的特殊之处。
counter(); // 输出 1
counter(); // 输出 2
counter(); // 输出 3
count变量被createCounter作用域封装,即使createCounter运行结束,count仍然保留在返回的匿名函数中。
示例 2:模拟私有变量
function createBankAccount(initialBalance) {
let balance = initialBalance;
return {
deposit(amount) {
balance += amount;
console.log(`存入: ${amount},余额: ${balance}`);
},
withdraw(amount) {
if (amount > balance) {
console.log("余额不足");
} else {
balance -= amount;
console.log(`取出: ${amount},余额: ${balance}`);
}
},
getBalance() {
return balance;
}
};
}
const myAccount = createBankAccount(100);
myAccount.deposit(50); // 存入: 50,余额: 150
myAccount.withdraw(30); // 取出: 30,余额: 120
console.log(myAccount.getBalance()); // 120
balance变量被封装在createBankAccount内部,外部无法直接修改它,起到数据保护的作用。
闭包常用于计数器、定时器、回调函数、事件处理等场景,在 JavaScript 开发中非常重要。