当前位置:首页 > JavaScript

curry js实现

2026-04-05 10:42:38JavaScript

curry js实现

柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。在JavaScript中,可以通过闭包和高阶函数实现柯里化。

基本柯里化实现

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 infiniteCurry(fn) {
  return function curried(...args) {
    return function(...args2) {
      if (args2.length === 0) {
        return args.reduce((acc, val) => fn(acc, val));
      }
      return curried(...args.concat(args2));
    }
  };
}

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

反向柯里化

反向柯里化(Uncurrying)是将柯里化函数转换回普通函数的过程:

Function.prototype.uncurry = function() {
  return (...args) => {
    let fn = this;
    for (const arg of args) {
      fn = fn(arg);
    }
    return fn;
  };
};

// 示例用法
const uncurriedSum = curriedSum.uncurry();
console.log(uncurriedSum(1, 2, 3)); // 6

实际应用场景

柯里化在函数组合和部分应用中非常有用:

curry js实现

// 部分应用
const add5 = curriedSum(5);
console.log(add5(10)(15)); // 30

// 函数组合
const compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);
const double = x => x * 2;
const square = x => x * x;
const doubleThenSquare = compose(square, double);
console.log(doubleThenSquare(5)); // 100

性能考虑

柯里化会创建多个闭包,可能影响性能。在生产环境中,应权衡使用,或在性能关键路径避免过度柯里化。

标签: curryjs
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js实现乘法

js实现乘法

实现乘法运算的方法 在JavaScript中实现乘法运算可以通过多种方式完成,以下列举几种常见方法: 基础运算符 直接使用乘法运算符*是最简单的方式: let result = 3 * 5; //…

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…

js尚未实现

js尚未实现

JavaScript 尚未实现的功能 JavaScript 作为一门不断发展的语言,仍有一些功能尚未被原生支持或标准化。以下是一些常见的尚未实现的功能或特性: Promise.any() 的替代方案…