当前位置:首页 > JavaScript

js compose 实现

2026-04-06 02:17:27JavaScript

实现 JavaScript 的 compose 函数

compose 函数是函数式编程中的一个重要概念,它可以将多个函数组合成一个新的函数,从右到左依次执行。

基本实现

最简单的 compose 实现方式:

const compose = (...fns) => 
  x => fns.reduceRight((v, f) => f(v), x);

这个实现:

js compose 实现

  • 接收任意数量的函数作为参数
  • 返回一个新函数
  • 使用 reduceRight 从右到左依次执行函数
  • 每个函数的输出作为下一个函数的输入

使用示例

const add5 = x => x + 5;
const multiply2 = x => x * 2;
const square = x => x * x;

const composedFn = compose(square, multiply2, add5);
console.log(composedFn(5)); // 输出 400

执行流程:

  • 先执行 add5(5) 得到 10
  • 然后执行 multiply2(10) 得到 20
  • 最后执行 square(20) 得到 400

异步版本实现

如果需要支持异步函数组合:

js compose 实现

const asyncCompose = (...fns) => 
  x => fns.reduceRight(
    (promise, fn) => promise.then(fn),
    Promise.resolve(x)
  );

更健壮的实现

添加参数验证和错误处理:

const compose = (...fns) => {
  if (fns.some(fn => typeof fn !== 'function')) {
    throw new TypeError('所有参数都必须是函数');
  }

  return x => fns.reduceRight((v, f) => {
    try {
      return f(v);
    } catch (error) {
      throw new Error(`函数执行错误: ${error.message}`);
    }
  }, x);
};

性能优化版本

使用循环代替 reduceRight 可能获得更好的性能:

const compose = (...fns) => {
  const length = fns.length;

  return x => {
    let result = x;
    for (let i = length - 1; i >= 0; i--) {
      result = fns[i](result);
    }
    return result;
  };
};

从左到右的 pipe 实现

与 compose 方向相反的 pipe 函数:

const pipe = (...fns) => 
  x => fns.reduce((v, f) => f(v), x);

实际应用场景

  1. 中间件处理:如 Express/Koa 的中间件系统
  2. 数据处理流水线:对数据进行多步转换
  3. 函数组合:将小函数组合成更复杂的功能

这些实现方式可以根据具体需求选择使用,基本版本适用于大多数场景,特殊需求可以考虑其他变体。

标签: jscompose
分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…