//核心考柯里化
//1.add()长度固定版//核心考柯里化
//1.add()长度固定版 。一次只能传一个参数时
function add(m){
var temp=function(n){
return add(m+n)
}
temp.toString=function(){
return m
}
return temp
}
let n=add(1)(2)(3)(4)
console.log(n)//console.log会自动调用toString方法
//2.add()长度固定版 。一次不止传一个参数
function add1(a,b,c,d){
return a+b+c+d
}
function curry(fn){
let _this=this
let args=[...arguments].slice(1)
let oldargs=args
return function temp() {
args=args.concat(...arguments)
if(args.length<fn.length){
console.log(args.length)
temp=fn.bind(_this,args)
return temp
}else{
console.log(args)
let val=fn.apply(_this,args)
args=oldargs
return val
}
}
}
let n1=curry(add1,2)
console.log(n1(1,3)()(4))
console.log(n1(5,6,7))
//3.add()长度不固定,一次不止传一个参数
function add2(){
return [...arguments].reduce((pre,cur)=>pre+cur,0)
}
function curry2(fn){
let args=[...arguments].slice(1)
let _this=this
let oldargs=args
return function temp(){
if([...arguments].length>0){
args=args.concat(...arguments)
temp=fn.bind(_this,args)
return temp
}else{
let val=fn.apply(_this,args)
args=oldargs
return val
}
}
}
let n2=curry2(add2,3,4)
console.log(n2(1,2)(3)())
console.log(n2(8)())
console