当前位置:首页 > JavaScript

curry js实现

2026-04-05 10:42:38JavaScript

curry js实现

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

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 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

实际应用场景

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

// 部分应用
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实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…