1.什么是函数组合?
add(squre(double(2)))
函数组合指的是将多个函数组合成一个新的函数,将一个函数的输出作为另一个函数的输入。将多个简单的函数组合成一个更为复杂的函数。
2.为什么有函数组合?
函数组合作用:使得函数职责单一,如果有bug更好的定位。
以下内容引入"是洋柿子啊"大佬中的《 【前端进阶】 由浅入深学会函数组合,进阶必备技能!2.0更新版!》
附链接:juejin.cn/post/701742…
在我们深入了解函数组合的时候,我们先看看以下的内容:
什么是管道
下面这张图表示程序中使用函数处理数据,a
参数输入给函数fn
,在fn
中经过各种逻辑处理从而得出结果b
,这就是数据a
通过管道fn
之后变成了b
。
管道拆分
上图中的管道看起来很方便,因为我们只需要维护这个管道就好
Q: 管道的长度、广度过大的时候,如果这个管道出现了一些纰漏,那我们排查起来的工作量就很大,很困难,该如何处理呢?
A: 拆分管道!
下面这张图我们将管道fn
拆分成了f3
、f2
、f1
,再通过参数a
的输入之后,经过f3
管道的处理获得m
, m
在通过f2
,如此进行,最终获得结果b
经过这样的拆分,我们可以保证每个函数的颗粒度,在之后出现问题的时候,我们可以更快更精准的进行问题打击,一击致命!bug
来的快,去的更快! (ps:中间产生的中间结果我们是不需要进行考虑的) 我们使用伪代码描述一下这张图
fn = compose(f1,f2,f3)
b = fn(a)
3.实现自动函数组合
function createCompse(isRight = true) {
return function compose(...fns) {
let len = fns.length;
// 类型检查
for (let i = 0; i < len; i++) {
if (typeof fns[i] !== "function") {
throw new TypeError("Expected arguments are functions");
}
}
// 函数是否从右向左运行
fns = isRight ? fns.reverse() : fns;
return function (...args) {
let index = 0;
let result = fns[index].apply(this, args);
while (++index < len) {
result = fns[index].call(this, result);
}
return result;
};
};
}
使用案例如下:
function addTwo(m) {
return m + 2;
}
function double(m) {
return m * 2;
}
function square(m) {
return m * m;
}
const composeRight = createCompse(false);
const composeLeft = createCompse();
const newFnOne = composeRight(addTwo, double, square); //执行顺序 square-> double -> addTwo
console.log(newFnOne(1)); //6
const newFnTwo = composeLeft(addTwo, double, square); //执行顺序 addTwo-> double -> square
console.log(newFnTwo(1)); //4
4.柯里化函数和函数组合的区别
函数柯里化是将多参数的函数转化为一系列接受单一参数的函数,目的是为了实现参数复用和创建可复用的函数。
函数组合是将多个函数组合成一个新的函数,目的是为了实现函数的 模块化 和 可组合性 。
它们分别关注于函数的参数处理和函数的组合关系。