# 组合

如果一个值要经过多个函数,才能变为另外一个值,就可以把所有中间步骤合并成『一个』函数,这叫做『函数的合成』(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无需传参
最近更新时间: 2023/3/21 19:40:56