实现函数的柯里化

71 阅读1分钟
/**
 * 实现函数的柯里化
 * 允许将一个接受多个参数的函数,转换为一系列接受单个参数的函数,以便于函数的复用和参数的灵活传递
 *
 * @param {Function} fn - 要柯里化的目标函数
 * @param {...any} bindArgs - 目标函数的前置参数
 * @returns {Function} - 返回一个新的柯里化后的函数,可以通过连续传递参数的方式来调用目标函数
 *
 * 使用示例:
 *
 * const add = (a, b, c) => a + b + c
 * const curryAdd = currying(add, 1)
 * console.log(curryAdd(2)(3)) 
 * // 输出结果:6(即 1 + 2 + 3)
 *
 */
function currying(fn,...bindArgs) {
  return (...args) => {
    const allArgs = [...bindArgs,...args];
    // 当所有参数都传递完成后,调用目标函数
    // 否则,继续柯里化
    if (allArgs.length >= fn.length) {
      return fn(...allArgs);
    } else {
      return currying(fn,...allArgs);
    }
  };
}

// 测试示例
const add = (a,b,c) => a + b + c

const addCurrying = currying(add, 1)(2)(3)

console.log(addCurrying) // 输出结果:6(即 1 + 2 + 3)