当前位置:首页 > JavaScript

js compose 实现

2026-03-14 08:12:55JavaScript

实现 JavaScript 的 compose 函数

compose 是一种函数式编程概念,用于将多个函数组合成一个函数,从右到左依次执行。以下是几种实现方式:

基础实现

const compose = (...fns) => 
  (x) => fns.reduceRight((acc, fn) => fn(acc), x);

使用示例:

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)); // ((5 + 5) * 2)^2 = 400

支持异步函数的实现

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

从左到右的管道(pipeline)实现

const pipe = (...fns) => 
  (x) => fns.reduce((acc, fn) => fn(acc), x);

使用递归的实现

const recursiveCompose = (...fns) => {
  const [first, ...rest] = fns.reverse();
  return (...args) => rest.reduce(
    (acc, fn) => fn(acc), 
    first(...args)
  );
};

实现原理说明

compose 函数利用了数组的 reduceRight 方法,从右到左依次执行函数:

  • 初始值是传入的参数 x
  • 每个函数将前一个函数的返回值作为输入
  • 最终返回组合后的函数

性能考虑

对于大量函数的组合,可能需要考虑性能优化:

  • 避免在循环或高频调用的地方使用 compose
  • 对于固定组合,可以预先计算并缓存组合结果

类型安全的 TypeScript 实现

type Func<T, R> = (arg: T) => R;

function compose<T1, T2, T3>(
  fn1: Func<T2, T3>,
  fn2: Func<T1, T2>
): Func<T1, T3>;
function compose<T1, T2, T3, T4>(
  fn1: Func<T3, T4>,
  fn2: Func<T2, T3>,
  fn3: Func<T1, T2>
): Func<T1, T4>;
// 可以继续添加更多重载
function compose(...fns: Function[]) {
  return (x: any) => fns.reduceRight((acc, fn) => fn(acc), x);
}

应用场景

compose 适用于:

js compose 实现

  • 数据处理流水线
  • 中间件系统
  • 函数转换链
  • 避免深层嵌套函数调用

标签: jscompose
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js如何实现继承

js如何实现继承

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

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…