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()方法的时候,会自动调用这个方法,进而输出值。