实现函数柯里化

107 阅读1分钟

什么是函数柯里化?

柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。 个人理解很像递归,递归出口就是最后函数参数为空也就是()

分为传入参数长度固定和传入长度不固定:

传入参数固定

const curry = (fn) =>
(judge = (...args) =>
    args.length === fn.length
    ? fn(...args)
    : (...arg) => judge(...args, ...arg));
const add = (a, b, c) => a + b + c;
const curryAdd = curry(add);
console.log(curryAdd(1)(2)(3)); // 6
console.log(curryAdd(1, 2)(3)); // 6
console.log(curryAdd(1)(2, 3)); // 6

传入参数不固定

function add(...args){
  // console.log(this == global); //true
  return args.reduce((a,b)=>a+b);
}
function curry(fn){
  let args = [];
  return function temp(...newArgus){
    if(newArgus.length){
      args = [...args,...newArgus];
      return temp;
    }else{
      let val = fn.apply(this,args);
      // console.log(this); //global
      args = []; //保证再次调用时清空
      return val;
    }
  }
}

let addCurry = curry(add);
console.log(addCurry(1)(2,3,4,5)());
只要耐着性子,按照步骤把程序慢慢的过一遍,就很容易理解了