1、什么是柯里化,举个例子,
function fn(a,b,c,d,e){
return a+b+c+d+e
}
如果每次传入的a,b,c的参数都相同的话,则会不停的重复这些步骤
函数柯里化则会固定好fn(a)(b)(c),之后只需传入d、e的参数就行
具体实现:
function curry(fn) {
let length = fn.length;//拿到fn函数的形参数量
return function foo() {
//拿到传入的实参并转化为数组
let args = Array.prototype.slice.call(arguments);
let len = args.length;
//如果传入的参数大于函数所需的形参,则直接执行fn并将所有参数传入
if (len >= length) {
return fn(...args)
}
//如果传入的参数不够,则继续收集传入的实参
return function () {
let innerArgs = Array.prototype.slice.call(arguments);
let allArgs = [...args, ...innerArgs];
let temp = foo(...allArgs);
return temp
}
}
}