当前位置:首页 > 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
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现报表

js实现报表

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

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…