当前位置:首页 > JavaScript

函数柯里化 js实现

2026-03-01 20:54:37JavaScript

函数柯里化的概念

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

基础实现方法

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

说明

  • 检查当前传入的参数数量是否达到原函数的参数长度(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('_'); // 定义占位符

示例

函数柯里化 js实现

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

注意事项

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

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

相关文章

react如何阻止函数组件更新

react如何阻止函数组件更新

阻止函数组件更新的方法 在React中,函数组件的更新通常由状态(state)或属性(props)的变化触发。以下是几种阻止函数组件不必要更新的方法: 使用React.memo进行浅比较 React…

如何看浏览器调用react函数

如何看浏览器调用react函数

查看浏览器中调用的React函数 在浏览器中查看React函数调用可以通过开发者工具实现。React开发者工具和浏览器内置的开发者工具结合使用,可以方便地追踪函数调用和组件行为。 安装React开发…

php函数使用递归实现

php函数使用递归实现

递归的基本概念 递归是一种在函数内部调用自身的编程技术。它通常用于解决可以被分解为相同问题的子问题的情况。递归函数需要有一个终止条件,否则会导致无限循环。 递归函数的实现 在PHP中,递归函数的实现…

php 函数 实现

php 函数 实现

PHP 函数实现基础 PHP 函数通过 function 关键字定义,语法如下: function functionName($param1, $param2 = "default") {…

js用函数实现反转数组

js用函数实现反转数组

使用函数反转数组的方法 方法1:使用 reverse() 方法 JavaScript 的数组原生提供了 reverse() 方法,可以直接反转数组。 function reverseAr…

js 实现indexof函数

js 实现indexof函数

实现 JavaScript 的 indexOf 函数 JavaScript 的 indexOf 方法用于返回指定值在字符串或数组中首次出现的位置。以下是一个自定义实现的示例,涵盖字符串和数组两种场景。…