# 组合
如果一个值要经过多个函数,才能变为另外一个值,就可以把所有中间步骤合并成『一个』函数,这叫做『函数的合成』(compose)。用于将多个函数合并成一个函数。
# 举例
const compose = (...funcs) => funcs.reduce((a, b) => (...args) => a(b(...args)));
function f1(arg){
console.log("f1",arg)
return arg;
}
function f2(arg){
console.log("f2",arg)
return arg;
}
function f3(arg){
console.log("f3",arg)
return arg;
}
const res = compose(f1, f2, f3)("omg"); // f1(f2(f3("omg"))) 洋葱模型
console.log("res", res);
// f3 omg
// f2 omg
// f1 omg
// res omg
将函数『串联』执行,一个函数的输出结果是另一个函数的输入参数。函数组合具有洋葱圈的执行结构。
在Redux与Koa等类库,函数组合是实现中间件的核心逻辑。
# point free
组合函数无须提及操作数据。
// 非 point free,因为提到了数据 word
const snakeCase = function (word) {
return word.toLowerCase().replace(/\s+/ig, '-');
};
// point free
const snakeCase = compose(join('. '), map(compose(toUpperCase, head)), split(' '));
initials("hunter stockton thompson");
// 'H. S. T'
point free
模式能够帮助我们减少不必要的命名,让代码保持简洁和通用。
对函数式代码来说,point free
是非常好的使用方式,它能告诉我们一个函数是否是接受输入返回输出的小函数。
# 总结
因此函数组合
具有如下特点:
- 执行顺序从右至左
- 多个函数组合成『一个』新函数
point free
无需传参