高阶函数与闭包的协同工作原理
- 高阶函数:高阶函数是指可以接受一个或多个函数作为参数,并且/或者返回一个函数的函数。它的主要作用是抽象通用的操作,将函数作为数据进行传递和操作,增强代码的灵活性和复用性。
- 闭包:闭包是指函数能够记住并访问其词法作用域,即使函数是在其词法作用域之外被调用。闭包由函数和与其相关联的词法环境组成。当一个函数在另一个函数内部定义,并且内部函数引用了外部函数的变量时,就形成了闭包。
- 协同工作:高阶函数常常利用闭包来捕获和存储外部函数的状态。通过将函数作为参数传递给高阶函数,高阶函数可以返回一个新的函数,这个新函数通过闭包记住了传递进来的函数以及高阶函数执行时的环境状态。这使得我们可以在不同的时机执行这些被捕获的函数,并利用闭包保存的状态进行复杂的计算。
实现支持柯里化(Currying)的函数组合(Function Composition)工具
// 柯里化函数
function curry(func) {
return function curried(...args) {
// 如果传入的参数数量大于等于原函数的参数数量,直接执行原函数
if (args.length >= func.length) {
return func.apply(this, args);
} else {
// 否则返回一个新函数,继续收集参数
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
// 函数组合函数
function compose(...funcs) {
return function(value) {
return funcs.reduceRight((acc, func) => {
return func(acc);
}, value);
};
}
// 示例函数
function add(a, b) {
return a + b;
}
function multiply(a, b) {
return a * b;
}
// 柯里化示例函数
const curriedAdd = curry(add);
const curriedMultiply = curry(multiply);
// 组合柯里化后的函数
const addThenMultiply = compose(curriedMultiply(3), curriedAdd(2));
// 执行组合后的函数
const result = addThenMultiply(5); // 先执行 add(2, 5) 得到 7,再执行 multiply(3, 7) 得到 21
console.log(result); // 输出 21
代码解释
curry
函数:它接受一个普通函数 func
作为参数,并返回一个柯里化版本的函数 curried
。curried
函数收集传入的参数,当参数数量足够时,调用原函数 func
。如果参数数量不足,返回一个新函数继续收集参数。这里利用了闭包,使得 curried
函数能够记住 func
以及 curried
执行时的环境状态(如已经收集的 args
)。
compose
函数:它接受多个函数作为参数,并返回一个新函数。这个新函数从右到左依次执行传入的函数,将前一个函数的返回值作为下一个函数的参数。这里同样利用了闭包,记住了传入的 funcs
数组。
- 示例函数
add
和 multiply
:简单的数学运算函数。
- 柯里化示例函数
curriedAdd
和 curriedMultiply
:通过 curry
函数将 add
和 multiply
柯里化。
addThenMultiply
函数:通过 compose
函数组合了 curriedMultiply(3)
和 curriedAdd(2)
,实现了先加后乘的功能。
- 执行
addThenMultiply(5)
:最终执行组合后的函数,输出结果 21
。通过这个例子展示了高阶函数(curry
和 compose
)与闭包的协同工作在实际应用中的效果。