什么是函数柯里化?
柯里化(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)());