Skip to content

Latest commit

 

History

History
30 lines (25 loc) · 1.19 KB

curry.md

File metadata and controls

30 lines (25 loc) · 1.19 KB

手写 curry

柯里化,可以理解为提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数。因为这样的特性,也被称为部分计算函数。柯里化,是一个逐步接收参数的过程。

// 核心思想是通过闭包将传入的参数全部都存在内存中,等待参数数量达标再执行传入的fn
function curry(fn) {
  var args = Array.prototype.slice.call(arguments, 1); // 将参数初始化时传入的参数全部保存在内存里,等待后续使用
  return function () {
    var combinedArgs = args.concat(Array.prototype.slice.call(arguments)); // 再次调用函数时拼接参数

    if (combinedArgs.length < fn.length) {
      // 如果累计的参数还没有达到函数要求的数量,则继续等待
      return curry.call(this, fn, ...combinedArgs);
    } else {
      // 否则执行传入的 fn 函数
      return fn.apply(this, combinedArgs);
    }
  }
}

let _fn = curry(function (a, b, c, d, e) {
  console.log(a, b, c, d, e)
});

_fn(1, 2, 3, 4, 5); // print: 1,2,3,4,5
_fn(1)(2)(3, 4, 5); // print: 1,2,3,4,5
_fn(1, 2)(3, 4)(5); // print: 1,2,3,4,5
_fn(1)(2)(3)(4)(5); // print: 1,2,3,4,5