JS---函数柯里化

函数柯里化

1. 什么是函数柯里化?

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

举例来说,一个接收3个参数的普通函数,在进行柯里化后,柯里化版本的函数接收一个参数并返回接收下一个参数的函数,该函数返回一个接收第三个参数的函数。最后一个函数在接收第三个参数后,将之前接收到的三个参数应用于原普通函数中,并返回最终结果。

2. JS 实现

function curry(fn, args) {
  // 获取函数需要的参数个数
  let len = fn.length;

  args = args || [];

  return function () {
    let copyArgs = args.slice(0);

    // 拼接得到现有的所有参数
    for (let i = 0; i < arguments.length; i++) {
      copyArgs.push(arguments[i]);
    }

    // 判断参数的长度是否已经满足函数所需参数的长度
    if (copyArgs.length >= len) {
      //  如果满足,执行函数
      return fn.apply(this, copyArgs);
      // return fn(...copyArgs);
    } else {
      // 如果不满足,递归返回科里化的函数,等待参数的传入
      return curry.call(this, fn, copyArgs);
    }
  }
}

3. es6 实现

function curry(fn, ...args){
  return fn.length <= args.length ? fn(...args) : curry.bind(null, fn, ...args);
}

4. 实例

function sum(a, b, c) {
  console.log(a + b + c);
}
//获取一个柯里化后的函数
let _sum = curry(sum);
// let _sum = curry2(sum);

//返回一个接收第二个参数的函数
let A = _sum(1);

//返回一个接收第三个参数的函数
let B = A(2);

//接收到最后一个参数,将之前所有的参数应用到原函数中,并运行
B(3);    // 6

curry(sum)(2)(3, 5);  // 10
curry(sum, 4)(3, 5);  // 12
curry(sum, 6, 8)(5);  // 19
curry2(sum)(2)(3, 5);
curry2(sum, 4)(3, 5);
curry2(sum, 6, 8)(5);
posted @ 2021-09-26 15:33  青柠i  阅读(48)  评论(0编辑  收藏  举报