← 返回首页

彻底搞懂 JavaScript 闭包

闭包是 JavaScript 中最重要也最容易让人困惑的概念之一。理解闭包对于掌握 JavaScript 至关重要。本文将通过大量实例带你彻底搞懂闭包。

1. 什么是闭包?

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

function outer() {
    const name = "皮皮";
    
    function inner() {
        console.log(name);
    }
    
    return inner;
}

const closure = outer();
closure(); // 输出:"皮皮"

2. 闭包的形成条件

  • 函数嵌套:一个函数内部定义了另一个函数
  • 内部函数引用外部函数的变量
  • 外部函数返回内部函数

3. 经典示例:计数器

function createCounter() {
    let count = 0;
    
    return {
        increment: () => {
            count++;
            console.log(count);
        },
        getCount: () => count
    };
}

const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
counter.increment(); // 3

4. 闭包的实际应用

数据私有化

function createPerson(name) {
    let age = 0;
    
    return {
        getName: () => name,
        getAge: () => age,
        birthday: () => { age++; return age; }
    };
}

函数工厂

function multiplyBy(factor) {
    return function(number) {
        return number * factor;
    };
}

const double = multiplyBy(2);
console.log(double(5)); // 10
核心要点: 闭包 = 函数 + 词法环境。函数可以"记住"它被创建时的环境。

总结

闭包是 JavaScript 的强大特性,广泛应用于数据封装、回调函数、事件处理等场景。理解闭包的工作原理,能够帮助你写出更优雅、更高效的代码。