当前位置:首页 > JavaScript

函数柯里化 js实现

2026-03-01 20:54:37JavaScript

函数柯里化的概念

函数柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,可以将一个接受多个参数的函数分解为多个嵌套的函数,每个函数只接受一个参数并返回一个新函数,直到所有参数收集完毕并返回最终结果。

函数柯里化 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));
      };
    }
  };
}

说明

函数柯里化 js实现

  • 检查当前传入的参数数量是否达到原函数的参数长度(fn.length)。
  • 如果满足条件,直接调用原函数并返回结果。
  • 否则返回一个新函数,继续收集剩余参数。

使用示例

function sum(a, b, c) {
  return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 输出: 6
console.log(curriedSum(1, 2)(3));  // 输出: 6
console.log(curriedSum(1, 2, 3));  // 输出: 6

支持占位符的高级实现

通过占位符(如_)可以灵活指定参数位置:

function curryWithPlaceholder(fn) {
  return function curried(...args) {
    const complete = args.length >= fn.length && !args.includes(curryWithPlaceholder._);
    if (complete) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        const mergedArgs = args.map(arg => 
          arg === curryWithPlaceholder._ && args2.length ? args2.shift() : arg
        ).concat(args2);
        return curried.apply(this, mergedArgs);
      };
    }
  };
}
curryWithPlaceholder._ = Symbol('_'); // 定义占位符

示例

const curriedSum2 = curryWithPlaceholder(sum);
console.log(curriedSum2(1, curryWithPlaceholder._, 3)(2)); // 输出: 6

注意事项

  • 原函数的参数长度(fn.length)必须明确,箭头函数或无参数默认值的函数可能导致length不准确。
  • 占位符实现会增加复杂度,需根据实际需求选择是否使用。

标签: 函数柯里
分享给朋友:

相关文章

jquery函数

jquery函数

jQuery 函数概述 jQuery 是一个快速、简洁的 JavaScript 库,通过封装原生 JavaScript 功能,简化 DOM 操作、事件处理、动画和 AJAX 等任务。其核心函数 $()…

vue实现异步函数

vue实现异步函数

Vue 中实现异步函数的几种方法 使用 async/await 在 Vue 方法或生命周期钩子中可以直接使用 async/await 语法处理异步操作。这种方式代码更清晰,易于理解。 method…

react函数如何调用redux

react函数如何调用redux

在React函数组件中调用Redux 使用react-redux库提供的useSelector和useDispatch钩子函数,可以在函数组件中访问Redux状态和派发action。 安装必要依赖:…

react如何定义全局函数

react如何定义全局函数

定义全局函数的几种方法 在React中定义全局函数可以通过多种方式实现,以下是常见的几种方法: 使用全局变量挂载 将函数直接挂载到window对象上,使其成为全局可访问的函数。这种方式简单直接,但…

react函数组件如何强制刷新

react函数组件如何强制刷新

强制刷新React函数组件的方法 在React函数组件中,强制刷新通常不推荐直接操作,因为React的设计理念是基于状态和props的自动更新。但在某些特殊情况下,可能需要手动触发更新。以下是几种常见…

react如何调用子组件的函数

react如何调用子组件的函数

调用子组件函数的常见方法 使用 ref 直接调用 通过 React.createRef() 或 useRef 创建引用,附加到子组件上。子组件需用 forwardRef 暴露内部方法,类组件则直接通过…