实现 add(1,2,3) == 6, add(1,2,3)() = 6, add(1)(2)(3) = 6, add(1)(2)(3)() = 6

 add(1, 2, 3, ...)是对传入参数的求和方法

function add (...args) {
    return args.reduce((prev, val) => {
        return prev + val
    })
}
 
let rs = add(1, 2, 3, 4, 5, 6)
console.log(rs)  // 21

add(1)(2)(3)是一个无限累加的函数add方法,都是将函数作为返回值输出,然后接收新的参数并进行计算。

function add (a) {
    var temp=function(b) { // 使用闭包
        a = a + b; // 累加
        return temp;
    }
    temp.toString = function() { // 重写toSting() 方法
        return a;
    }
    return temp; // 返回一个函数
}
 
console.log(add(1)(3)) // f 4
console.log(add(1)(3)(5)) // f 9

综合写法

function add () {

    let res = [...arguments].reduce((a, b)=>{
        return a+b;
    }, 0);

    let temp=function() { // 使用闭包
        if(arguments.length){
            res+=[...arguments].reduce((a, b)=>{
                return a+b;
            }, 0);           // 累加
            return temp;            
        }
     
else{ return res; } }
temp.toString
= function() { // 重写toSting() 方法 return res; }
return temp; // 返回一个函数 } console.log(add(1,2,3)()) //6 console.log(add(1,2,3)) //f 6 console.log(add(1)(3)) // f 4 console.log(add(1)(3)(5)()) //9

 

实现 add(1)(2)(3)().res = 6, add(1,2)(3)().res = 6

function add(){
    let res = [...arguments].reduce((a, b)=>{
        return a+b;
    }, 0);
    let obj = {res: res};
    let innerAdd = function(){
        if(arguments.length===0){
            return obj;
        }else{
            res += [...arguments].slice(1).reduce((a, b)=>{
                return a+b;
            }, 0);
            obj.res = res;
            return innerAdd;
        }
    }

    innerAdd.toString = function(){
        return res;
    }
    innerAdd.toValue = function(){
        return res;
    }
    return innerAdd;
}

 

posted @ 2020-05-27 12:29  apple78  阅读(799)  评论(0)    收藏  举报