add(1)(2)(3)和add(1,2)(3)实现累加

借助于当没有调用函数时直接打印函数会调用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

你可能感兴趣的:(add(1)(2)(3)和add(1,2)(3)实现累加)