我想在javascript中实现该功能,让我们说Add
应该支持以下格式
add(a,b,c)
add(a)(b)(c)
add(a)(b,c)
add(a,b)(c)
所有这些都应该返回a+b+c
。可能吗?如果是这样的话?
答案 0 :(得分:1)
您可以执行类似
的操作
function add(){
let sum = 0;
for(let e of arguments) sum += e;
let ret = add.bind(null, sum);
ret.toString = () => sum;
ret.valueOf = () => sum;
return ret;
}
let x = +add(2, 3)(4)(11)
console.log(x, typeof x);
答案 1 :(得分:1)
每当运行该函数时,将arguments object参数收集到一个数组中,并检查它的长度。如果数组的长度为3或更大,则使用Array#reduce将前3个数字相加。如果没有,请返回该功能。
function add() {
var args = []; // collect the arguments
function innerAdd() {
args.push.apply(args, arguments); // add the arguments to args
// if the length of args is under 3 return innerAdd, if not sum the first 3 numers
return args.length < 3 ? innerAdd : args.slice(0, 3).reduce(function(s, n) {
return s + n;
});
}
return innerAdd.apply(null, arguments); // invoke innerAdd with current arguments
}
var a = 1, b = 2, c = 3;
console.log(add(a,b,c));
console.log(add(a)(b)(c));
console.log(add(a)(b,c));
console.log(add(a,b)(c));