// 柯里化旨在将多个参数分多次传入
// 获得实参个数,获得实参
// 返回一个匿名方法,他的返回函数要能拼接两次传入的参数
function curry(fn, args){
let length = fn.length // 形参个数
args = args || [] // 实参
return function(){
newArgs = args.concat(Array.prototype.slice.call(arguments))
// console.log(Array.from(arguments).slice())
// console.log(Array.prototype.slice.call(arguments))
if(newArgs.length < length){
return curry.call(this, fn, newArgs)
}else{
return fn.apply(this, newArgs)
}
}
}
function multiFn(a,b,c){
return a * b * c
}
let multi = curry(multiFn)
console.log(multi(1)(2)(3))
multi(2)(3)(4);
multi(2,3,4);
multi(2)(3,4);
multi(2,3)(4)
// ES6柯里化写法
let curryES = (fn, arr = []) => (...args) => (
arg => arg.length === fn.length
?
fn(...arg)
:
curryES(fn,arg)
)([...args,...arr])
let curryTest = curryES((a,b,c,d)=>a+b+c+d)
console.log(curryTest(1)(2)(3)(4))
console