JavaScript 闭包(Closure)是一种非常重要的概念,它允许一个函数在声明它的词法环境(lexical environment)中访问并操作该环境中的变量。闭包具有以下作用:
function createCounter() {
let count = 0; // 私有变量
return function() {
count += 1;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 输出 1
console.log(counter()); // 输出 2
// console.log(count); // 报错:ReferenceError: count is not defined
function createAdder(x) {
return function(y) {
return x + y;
};
}
const add5 = createAdder(5);
const add10 = createAdder(10);
console.log(add5(3)); // 输出 8
console.log(add10(3)); // 输出 13
实现模块化和代码组织:闭包可以帮助我们将相关的代码组织在一起,形成模块,提高代码的可读性和可维护性。
函数柯里化(Currying):闭包可以用于实现函数柯里化,即将一个多参数函数转换为一系列单参数函数。
function curryAdd(x) {
return function(y) {
return function(z) {
return x + y + z;
};
};
}
const add1 = curryAdd(1);
const add1and2 = add1(2);
console.log(add1and2(3)); // 输出 6
function higherOrderFunction(fn) {
return function(...args) {
console.log(`Calling function with arguments: ${args}`);
return fn(...args);
};
}
function myFunction(a, b) {
return a + b;
}
const higherOrderFn = higherOrderFunction(myFunction);
console.log(higherOrderFn(1, 2)); // 输出 "Calling function with arguments: 1,2" 和 3
总之,闭包是 JavaScript 中一个非常强大的特性,它可以帮助我们实现数据封装、保持变量状态、模块化代码、函数柯里化和高阶函数等。