标准答案

  1. pipe 按传入顺序从左到右执行,前一个函数的返回值作为后一个函数的入参。
  2. compose 通常从右到左执行,最后一个函数先处理输入。
  3. 同步版本可以用 reduce 或 reduceRight 实现。
  4. 要注意第一个函数可能接收多个参数,后续函数通常只接收上一步结果。
  5. 如果组合链里有异步函数,要改成 Promise 链或 async/await 版本。

题目解析

compose / pipe 的价值是把连续的数据处理步骤显式串起来,避免写成多层临时变量或嵌套调用。它适合输入输出稳定、每一步职责清楚的函数链。

两者主要差异是阅读方向。pipe 更接近日常阅读顺序,从输入开始一步步向后走;compose 更接近数学函数组合,从最右侧函数开始执行。

实现时不要只背 reduce。更重要的是说明函数组合的约束:每一步输出要能成为下一步输入,组合链太长时要保证命名和错误处理足够清晰。

代码示例

同步 pipe 和 compose 可以分别用 reduce 与 reduceRight 实现。

JavaScript
const pipe = (...fns) => (...args) => {
  return fns.reduce((result, fn, index) => {
    return index === 0 ? fn(...result) : fn(result)
  }, args)
}

const compose = (...fns) => (...args) => {
  return fns.reduceRight((result, fn, index) => {
    return index === fns.length - 1 ? fn(...result) : fn(result)
  }, args)
}

常见误区

  • 讲不清 compose 和 pipe 的执行方向,只说“都是组合函数”。
  • 默认所有函数都能接收多个参数,忽略后续函数通常只接收上一步结果。
  • 把异步函数混进同步组合链,结果得到 Promise 却没有处理。

作者信息