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