compose 实现函数从右到左组合,如 f(g(h(x))),用 reduceright 累积执行;要求函数柯里化且数据参数在末位,推荐 lodash/fp;pipe 则从左到右,语义更贴近流程阅读习惯。

JavaScript 中实现 compose 功能,核心是用高阶函数把多个单参函数“叠”成一个新函数,让数据从右往左自动流过每个处理环节。
compose 的执行逻辑:从右到左串函数
compose 不是简单拼接,而是定义一种执行顺序:最右边的函数先接收原始输入,它的返回值立即作为参数传给左边的函数,依此类推。数学上对应 f ∘ g ∘ h,即 f(g(h(x)))。
- 输入数据只传一次,比如
compose(f, g, h)(x) - 实际调用等价于
f(g(h(x))),不是h(g(f(x))) - 所有中间函数必须是纯函数、单参,否则链会断掉
手写一个基础 compose 函数
用 reduceRight 最简洁直观,因为它天然按从右到左遍历数组:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
fns是函数数组,如[map(fn), filter(pred), sortBy(key)] -
reduceRight把x作为初始值,依次被每个函数处理 - 如果数组为空,直接返回
x;若只有一个函数,也正常执行
让 compose 更实用的两个关键点
真实项目中,光有骨架不够,还需配合函数设计习惯:
-
函数必须柯里化且数据参数在末位:例如
filter(predicate)(list)而不是filter(list)(predicate),这样filterByStatus('active')才能直接放进 compose 链 -
优先使用 fp 工具库:lodash/fp 中的
map、filter、get默认就是柯里化 + 数据在尾,开箱即用,避免手动封装出错
对比 pipe:从左到右的另一种组合方式
如果更习惯“数据先经过 A,再进 B,最后到 C”的阅读顺序,可用 pipe:
const pipe = (fns) => (x) => fns.reduce((acc, fn) => fn(acc), x);-
pipe(f, g, h)(x)等价于h(g(f(x))) - 语义更贴近 Unix 管道
|或 RxJS 的pipe(),适合强调流程走向 - 和 compose 本质相同,只是遍历方向不同,选哪个取决于团队约定或可读性偏好
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










