标准答案
- pipe 按传入顺序从左到右执行,前一个函数的返回值作为后一个函数的入参。
- compose 通常从右到左执行,最后一个函数先处理输入。
- 同步版本可以用 reduce 或 reduceRight 实现。
- 要注意第一个函数可能接收多个参数,后续函数通常只接收上一步结果。
- 如果组合链里有异步函数,要改成 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 却没有处理。