# 柯里化(Currying)
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数, 并且返回接受余下的参数且返回结果的新函数的技术
// Array.prototype.slice.call(arguments) === [].slice.call(arguments) === [...arguments]
// []是不具备slice方法的,但是会沿着原型链一直往上找到Array,然后调用
function curry(fn, args) {
var args = args || [];
return function(){
console.log([...arguments])
newArgs = args.concat([...arguments]) // 这一步是收集参数
// 如果收集的参数个数大于等于fn的参数个数执行fn,如果没有递归执行
if (newArgs.length < fn.length) {
// return curry.call(this,fn,newArgs);
}else{
// return fn.apply(this,newArgs);
fn(newArgs)
}
}
}
var multiFn = (a, b, c) => a * b * c
var multi = curry(multiFn);
console.log(multi(2)(3)(4))
// console.log(multi(2,3,4))
// console.log(multi(2)(3,4))
// console.log(multi(2,3)(4))