组合函数是将多个一元函数按顺序串联执行的编程模式,pipe从左到右执行如h(g(f(x))),compose从右到左执行如f(g(h(x))),提升代码可读性、复用性与可测试性。

组合函数(Function Composition)是 JavaScript 中一种将多个函数串联起来、让前一个函数的输出作为后一个函数输入的编程模式。它的核心思想是:把一系列小而专注的函数“拼装”成一个更强大的新函数,而不是写一个大而复杂的函数。
组合函数的基本形式
最典型的组合是右结合(compose)或左结合(pipe)。两者区别在于执行顺序:
- compose(f, g, h) 等价于 f(g(h(x))) —— 从右往左执行
- pipe(f, g, h) 等价于 h(g(f(x))) —— 从左往右执行(更符合阅读直觉)
手写一个 pipe 函数
这是最常用、也最容易理解的组合方式:
const pipe = (...fns) => (x) => fns.reduce((acc, fn) => fn(acc), x);
说明:
立即学习“Java免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
- ...fns 收集所有要组合的函数
- (x) => ... 返回一个接收初始值的新函数
- reduce 把上一次调用结果传给下一个函数,形成链式传递
例子:
const add1 = (x) => x + 1; const double = (x) => x * 2; const toString = (x) => String(x);const transform = pipe(add1, double, toString); console.log(transform(3)); // "8" → (3+1)→4 → 4*2→8 → String(8)→"8"
为什么组合函数有用
它让代码更清晰、可复用、易测试:
- 每个函数只做一件事(单一职责),比如格式化、校验、转换
- 可以自由拆分、替换、复用某一段逻辑,比如把 double 换成 square
- 避免嵌套调用,减少括号嵌套带来的理解负担:
toString(double(add1(3)))不如pipe(add1, double, toString)(3)直观 - 天然适合处理数据流,比如在 Redux、RxJS 或表单处理中常见
实际使用中的注意事项
组合函数不是万能的,要注意几点:
- 所有函数必须是一元函数(只接收一个参数),否则会出错;若需多参,先用闭包或柯里化预置参数
- 执行顺序和错误传播需留意:中间某个函数抛错,整个链就中断;如有异步,需用 asyncPipe 或 Promise 链适配
- 调试时看不到中间值?可在组合中插入日志函数,例如 x => (console.log(x), x)
- Lodash、Ramda 等库已提供 flow(即 pipe)和 flowRight(即 compose),可直接用,无需重复造轮子










