闭包是指有权访问另一个函数作用域中的变量的函数。简单来说,闭包使得函数内的变量在函数执行后仍然存在。
闭包的使用场景有:
- 实现私有变量:通过闭包可以实现私有变量,只能在闭包内访问。
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
counter(); // 0
counter(); // 1
这里 count 是私有变量,只能在闭包内访问。
- 实现缓存:通过闭包的方式,可以实现简单的缓存机制。
function makeCache() {
const cache = {};
return function(key) {
if (cache[key]) {
return cache[key];
} else {
let value = key + ' value';
cache[key] = value;
return value;
}
};
}
const getValue = makeCache();
getValue('a'); // 'a value'
getValue('a'); // 返回缓存的值 'a value'
- 实现柯里化:通过闭包可以实现柯里化,即将接收多个参数的函数变换成接收一个单一参数的函数。
function curry(func) {
return function(a) {
return function(b) {
return func(a, b);
};
};
}
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
curriedSum(1)(2); // 3
所以闭包的主要用途是封装变量,实现私有变量、缓存、柯里化等高级功能。理解闭包的工作原理和作用,是精通 JavaScript 的基础。