Js:闭包

59 阅读1分钟

闭包(Closure)是指一个函数能够访问其外部函数作用域中的变量即使外部函数已经执行完毕(这个很重要)。闭包常用于数据封装保持变量的持久化

闭包的作用

  1. 数据私有化(避免全局变量污染)
  2. 创建一个持久的作用域(数据不会被垃圾回收)
  3. 实现封装和模块化(常用于计数器、缓存、事件监听等)

示例 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 开发中非常重要。