当前位置:首页 > JavaScript

函数柯里化 js实现

2026-01-31 05:44:19JavaScript

函数柯里化的概念

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

基本实现方法

以下是一个简单的柯里化函数实现示例,支持固定参数数量的函数:

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

function sum(a, b, c) {
  return a + b + c;
}

const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 输出 6

支持占位符的柯里化

某些场景需要更灵活的柯里化,例如允许跳过某些参数(通过占位符暂存位置)。以下是一个支持占位符的实现:

const _ = Symbol('placeholder');

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.length ? nextArgs.shift() : arg);
        return curried.apply(this, [...mergedArgs, ...nextArgs]);
      };
    }
  };
}

使用示例:

函数柯里化 js实现

function multiply(a, b, c) {
  return a * b * c;
}

const curriedMultiply = curryWithPlaceholder(multiply);
console.log(curriedMultiply(_, 2)(1)(3)); // 输出 6(1 * 2 * 3)

无限参数的柯里化

对于参数数量不固定的函数(如add(1)(2)(3)...),需通过显式调用(如.value())触发计算:

function infiniteCurry(fn) {
  let accumulatedArgs = [];
  const wrapper = function(...args) {
    accumulatedArgs.push(...args);
    return wrapper;
  };
  wrapper.value = function() {
    const result = accumulatedArgs.reduce(fn);
    accumulatedArgs = [];
    return result;
  };
  return wrapper;
}

使用示例:

const add = infiniteCurry((a, b) => a + b);
console.log(add(1)(2)(3).value()); // 输出 6

实际应用场景

  • 参数复用:提前固定部分参数(如配置项),后续只需传递动态参数。
  • 延迟执行:分步传递参数,直到满足条件才触发最终计算。
  • 函数组合:与compose结合,构建可读性更高的流水线操作。

注意事项

  • 原函数的参数长度(fn.length)需明确,否则需手动指定参数数量。
  • 箭头函数无argumentslength属性,可能影响柯里化行为。
  • 性能敏感场景需谨慎使用,嵌套函数调用可能带来额外开销。

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

相关文章

react函数如何调用redux

react函数如何调用redux

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

react函数组件如何更新

react函数组件如何更新

React 函数组件更新方法 使用 useState Hook 通过 useState Hook 可以定义组件的状态,并触发重新渲染。useState 返回一个状态值和一个更新状态的函数。调用更新函数…

php实现按钮实现函数功能

php实现按钮实现函数功能

实现按钮调用函数的基本方法 在PHP中实现按钮触发函数功能通常需要结合HTML表单或JavaScript。PHP是服务器端语言,按钮点击事件需通过HTTP请求传递到服务器才能执行PHP函数。 HTM…

js函数实现大括号匹配

js函数实现大括号匹配

大括号匹配的 JavaScript 实现 大括号匹配是指检查字符串中的大括号 { 和 } 是否成对出现且嵌套正确。以下是几种实现方法: 使用栈结构进行匹配 栈是解决括号匹配问题的经典数据结构…

函数js实现

函数js实现

函数的基本语法 在JavaScript中,函数可以通过function关键字定义,基本语法如下: function functionName(parameters) { // 函数体 ret…

js bind 函数 实现

js bind 函数 实现

实现 bind 函数的核心原理 bind 函数的主要功能是创建一个新函数,该函数在被调用时会将指定的 this 值和预设参数传递给原函数。实现时需要处理 this 绑定和参数传递。 基本实现…