当前位置:首页 > JavaScript

curry js实现

2026-03-13 16:19:22JavaScript

以下是使用 JavaScript 实现柯里化(Curry)的几种方法:

基础柯里化实现

通过闭包和递归实现一个通用的柯里化函数:

curry js实现

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      };
    }
  };
}

// 示例用法
function sum(a, b, c) {
  return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 6

支持占位符的柯里化

实现一个可以指定参数位置的柯里化函数:

curry js实现

function curryWithPlaceholder(fn) {
  return function curried(...args) {
    const complete = args.length >= fn.length 
      && !args.slice(0, fn.length).includes(curryWithPlaceholder.placeholder);

    if (complete) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        const mergedArgs = args.map(arg => 
          arg === curryWithPlaceholder.placeholder && args2.length ? args2.shift() : arg
        ).concat(args2);
        return curried.apply(this, mergedArgs);
      };
    }
  };
}

curryWithPlaceholder.placeholder = Symbol();

// 示例用法
const _ = curryWithPlaceholder.placeholder;
const curriedSum2 = curryWithPlaceholder(sum);
console.log(curriedSum2(1, _, 3)(2)); // 6

无限参数柯里化

实现一个不依赖函数参数长度的柯里化版本:

function infiniteCurry(fn) {
  return function curried(...args) {
    return function(...args2) {
      const allArgs = [...args, ...args2];
      if (args2.length === 0) {
        return allArgs.reduce(fn);
      }
      return curried(...allArgs);
    };
  };
}

// 示例用法
const add = infiniteCurry((a, b) => a + b);
console.log(add(1)(2)(3)(4)()); // 10

自动柯里化装饰器

使用ES6 Proxy实现自动柯里化:

function autoCurry(fn) {
  return new Proxy(fn, {
    apply(target, thisArg, args) {
      if (args.length >= target.length) {
        return target.apply(thisArg, args);
      }
      return autoCurry(target.bind(thisArg, ...args));
    }
  });
}

// 示例用法
const curriedSum3 = autoCurry(sum);
console.log(curriedSum3(1, 2, 3)); // 6
console.log(curriedSum3(1)(2, 3)); // 6

每种实现方式适用于不同场景,基础柯里化适合固定参数函数,占位符版本提供更大灵活性,无限参数柯里化适合可变参数函数,Proxy实现则提供了更简洁的语法。

标签: curryjs
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现pdf在线预览

js实现pdf在线预览

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

js实现延迟

js实现延迟

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

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…