借助于当没有调用函数时直接打印函数会调用toString方法
//。。。三个点表示参数可变(一个或则多个)
function add(...a){
//这里得到的a为一个数组队列
//使用reduce(前一个计算返回的(默认第一个),当前的(默认第二个),当前索引,原来数组),将所有参数累加
var s=a.reduce(function(pre,x,index,arr){
return pre+x
})
//定义一个函数(就是第二个括号)
function sum1(...b){
var s1=b.reduce(function(pre,x,index,arr){
return pre+x
})
//第一轮的相加
s=s+s1
//雷同外围
function sum2(...c){
var s2=c.reduce(function(pre,x,index,arr){
return pre + x
})
//第二轮的相加
s=s+s2
return s
}
sum2.toString=function(){
return s
}
return sum2
}
//函数打印会调用toString函数,重写toString实现将s返回
sum1.toString=function(){
return s
}
//返回一个函数对象指针
//(当不加第二个括号时,函数没被调用,实现的是直接打印函数体,调用toString方法)
//(当第二个括号运用时,实际是该函数被调用)
return sum1
}
console.log(add(1))//1
console.log(" ————————————————")
console.log(add(1)(2))//3
console.log(" ————————————————")
console.log(add(1)(2)(3))//6
console.log(" ————————————————")
console.log(add(1)(2,3))//6
console.log(" ————————————————")
console.log(add(1,2)(3))//6
console.log(" ————————————————")
console.log(add(1,2,3))//6