当前位置:首页 > JavaScript

js curry实现

2026-02-01 02:59:23JavaScript

柯里化(Currying)的概念

柯里化是一种将多参数函数转换为一系列单参数函数的技术。例如,f(a, b, c) 转换为 f(a)(b)(c)

实现基础柯里化

以下是一个简单的柯里化实现,支持固定参数长度的函数:

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

使用示例:

js curry实现

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.includes('_');
    if (complete) {
      return fn.apply(this, args);
    } else {
      return function(...nextArgs) {
        const mergedArgs = args.map(arg => arg === '_' ? nextArgs.shift() : arg);
        return curried.apply(this, mergedArgs.concat(nextArgs));
      };
    }
  };
}

使用示例:

js curry实现

const curriedSumWithPlaceholder = curryWithPlaceholder(sum);
console.log(curriedSumWithPlaceholder('_', 2)(1)(3)); // 6

无限参数柯里化

对于参数不固定的函数(如 ...args),需手动指定终止条件(如空参数调用):

function infiniteCurry(fn) {
  return function curried(...args) {
    if (args.length === 0) {
      return fn.apply(this, args);
    } else {
      return function(...nextArgs) {
        if (nextArgs.length === 0) {
          return fn.apply(this, args);
        }
        return curried.apply(this, args.concat(nextArgs));
      };
    }
  };
}

使用示例:

const add = infiniteCurry((...nums) => nums.reduce((a, b) => a + b, 0));
console.log(add(1)(2)(3)()); // 6

注意事项

  • 参数长度检测:基础柯里化依赖 fn.length,因此不适用于可变参数函数(如 ...args)。
  • 上下文绑定:使用 apply 确保函数调用时的 this 正确。
  • 性能:柯里化可能增加调用栈深度,需权衡可读性与性能。

标签: jscurry
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js手势实现

js手势实现

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

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js 实现滚动

js 实现滚动

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