当前位置:首页 > JavaScript

curry js实现

2026-03-13 16:19:22JavaScript

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

基础柯里化实现

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

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

支持占位符的柯里化

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

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实现自动柯里化:

curry js实现

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
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现百叶窗

js实现百叶窗

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

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…