实现一个函数add(1)(2)
一想,这不是很简单。
function add(num){
let sum = num;
return function(num){
return sum+num
}
}
console.log(add(1)(2));
然后又问,如何实现add(1)(2)(3)…
总不能无限嵌套下去吧。
于是,就想到了返回一个函数名,在函数内部判断是否还有参数传进来
function add(num){
let sum =num;
return adds = function (num1){
if(num1) {
sum = sum+num1;
return adds
}
else return sum
}
}
console.log(add(1)(2)(3)());
嗯。一运行完美解决了问题。
这时候又来了一个问题,
add(1,2,3)(2,1)(3)(2,1,3)
因为现在每次调用传入的参数是不定长的。所以并不能直接把形参给写死。
这时候arguments(需要调用array.from()将参数转化为数组)或者…rest就有了用处了。
代码如下:
function add(...rest){
let params = rest; //收集参数
let getparams = function(...rest){
if(rest.length == 0) return params.reduce((pre,now) => pre+now,0) //当传入的参数为空时,对参数数组遍历求和。
params.push(...arguments);//收集参数
return getparams;
}
return getparams //重复调用,直到传入参数为空
}
let a = add(1,2)(2,1)(3)();
console.log(a);
还有另一种写法如下
// function add() {
// let _args = Array.from(arguments);
// var _adder = function () {
// console.log("我被执行了");
// _args.push(...arguments);
// return _adder;
// };
// _adder.toString = function () {
// console.log("我是tostring");
// return _args.reduce((pre, now) => {
// return pre + now;
// }, 0);
// };//重写tostring
// return _adder;
// }
// let a = add(1,2)(2,1)(3);
// console.log(+a);//触发隐式转化函数
思路差不多都是一样的,只不过在遍历数组进行求和的方式不一样,所以导致调用的方式不一样,上一种是通过参数是否为空实现遍历,后面是通过隐式转换。
隐式转换:valueOf方法和toString方法被重写过,则会根据valueOf返回的数据类型(基本数据类型则不)判断是否执行toString。