当前位置:首页 > 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));
      };
    }
  };
}

使用示例:

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));
      };
    }
  };
}

使用示例:

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 正确。
  • 性能:柯里化可能增加调用栈深度,需权衡可读性与性能。

js curry实现

标签: jscurry
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…