js方法实现add(1,2) add(1)(2)累加的方法

698 阅读1分钟

1、有时候看到一些小问题,比如add(1,2,3,...)这种实现参数累加的实现方法。

现在来实现一下

function add(){  
    const args = Array.prototype.slice.call(arguments, 0);  
    return args.reduce((a,b) => a + b)
}
const sum = add(1,2,3,4)

这样就能实现了,可是有时候我们想实现的可不是累加,而是累乘呢?这时候该能怎么完善这个方法呢?

我们可以想到把方法抽离出来,当做入参传入方法内。

const curry = function (fn) {  
    const args = Array.prototype.slice.call(arguments, 1);  
    return function() {      
        const newArgs = args.concat([].slice.call(arguments));      
        return fn.apply(this, newArgs);  
    };
};
/* 抽离出来处理数据方法 */
function add(){  
    const args = Array.prototype.slice.call(arguments, 0);  
    return args.reduce((a,b) => a + b)
}
const addCurry = curry(add, 1, 2,3,4,5);
const sum = addCurry() // 15

2、add(1)(2)(3)这种的累加方法如何实现呢?下面我们来实现一下吧

function add (a) {  
    function sum(b) { 
        // 使用闭包      
        a = a + b; // 累加      
        return sum;  
    }  
    sum.toString = function() { // 重写toSting() 方法      
    return a;  
}  
    return sum; // 返回一个函数
}
const sum = add(1)(2)(3) // f 6

此方法是通过闭包保存上一次传入的参数,并且进行累加,然后再次调用方法的时候使用这个新值,再重写toString方法,输出这个闭包的值。在console.log() alert()方法的时候,会自动调用这个方法,进而输出值。