一、是什么?
管道函数是一种将多个函数从左到右串联起来执行的函数组合方式,即将前一个函数的输出作为后一个函数的输入,依次传递直至最后一个函数。这种模式常用于数据处理、函数式编程中。
组合函数与管道函数相反,将多个函数从右到左串联起来执行。
形式上类似 F( G ( H (x) ) )
优点:
1. 可读性强:通过管道和组合操作可以让代码看起来像是一个流畅的工作流程,更容易理解每一步骤如何影响数据流。
2. 代码组织清晰:每个步骤职责单一,易于重用和替换。
3. 降低耦合度:每个函数独立处理数据的一部分,不需要了解整个处理流程的细节。
缺点:
1. 性能开销:过多的函数调用可能导致额外的性能损失,尤其是在涉及到大量数据或复杂计算的情况下。
2. 错误追踪难度增大:如果在一个长的管道中出现问题,定位错误所在步骤可能会比较困难。
二、代码实现
通过...funs接收任意个数需要组合或管道操作的函数。然后返回接收一个参数为初始值val的函数,这个函数的返回值为对接收的函数数组funs进行reduce迭代的结果。
reduce方法接受一个回调函数和一个初始值val :
- 回调函数有两个参数:累计器acc和当前项fun。
- 在每次迭代中,将当前函数fun应用于累计器acc的当前值,并将结果作为下一次迭代的累计器acc的值。
- 最终,当所有函数都已执行完毕后,reduce方法返回的就是最后一个函数执行后的结果。
function f1(a) {
return a * 2;
}
function f2(b) {
return b * 2;
}
const compose = function (...funs) {
return function (val) {
//组合函数从右向左执行函数,所以需要对函数数组进行reverse逆序操作。
return funs.reverse().reduce((arr, fun) => fun(arr), val);
};
};
const pipe = function (...funs) {
return function (val) {
return funs.reduce((arr, fun) => fun(arr), val);
};
};
const f3 = compose(f1, f2);
const f4 = pipe(f1, f2);
console.log(f3(2));
console.log(f4(5));