JavaScript 中的闭包详解
闭包的定义
闭包(Closure)是指一个函数能够记住并访问其词法作用域,即使该函数在其词法作用域之外执行。简单来说,闭包就是"函数 + 函数能够访问的外部变量"的组合。
基本示例
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
在上面的例子中,内部匿名函数持有对 count 变量的引用,即使 createCounter 已经执行完毕,count 仍然存在并被内部函数访问。
实际应用场景
闭包常用于数据封装和模块化。例如,可以创建一个简单的缓存函数:
function memoize(fn) {
const cache = {};
return function(arg) {
if (cache[arg] === undefined) {
cache[arg] = fn(arg);
}
return cache[arg];
};
}
const slowSquare = n => { /* 耗时计算 */ return n * n; };
const fastSquare = memoize(slowSquare);
注意事项
闭包会持有对外部变量的引用,如果使用不当可能导致内存泄漏。在不再需要时,应及时解除引用。此外,循环中使用闭包时要特别注意变量的作用域问题,ES6 的 let 关键字可以有效解决这类问题。