闭包(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解释:
createCounter执行后返回了内部匿名函数。内部函数引用了外部函数的变量
count,即使createCounter已经执行完毕,count依然被保留在内存中,因为内部函数持有对它的引用。每次调用
counter(),都会修改并返回同一个count变量。
另一种常见形式:立即执行函数(IIFE)创建闭包
const add = (function() {
let sum = 0;
return function(x) {
sum += x;
return sum;
};
})();
console.log(add(5)); // 5
console.log(add(3)); // 8闭包的作用
数据私有化:外部无法直接访问
count,只能通过返回的函数操作。保持状态:函数调用之间共享同一个变量。
回调与事件处理:常用于异步操作中保留上下文。
注意事项
闭包会占用更多内存,因为被引用的变量不会被垃圾回收,直到闭包本身不再被引用。
循环中创建闭包时,注意变量共享问题(通常用
let或 IIFE 解决)。
总结:在函数内部定义函数,并让内部函数访问外部函数的变量,然后将内部函数暴露出去,就创建了一个闭包。