我想编写一个add函数,为每个表达式生成正确的输出。
add(1)(2, 3)(4)
add(1)(2)(3)(4)
add(1, 2, 3, 4)
我尝试了三种方法,但是这三种方法都有缺陷。你有更好的方法吗?
这是我尝试过的三种方法:
function add() {
var arg = Array.prototype.slice.call(arguments);
var fn = function() {
arg = arg.concat(Array.prototype.slice.call(arguments));
return add.apply(null, arg);
}
fn.valueOf = function() {
return arg.reduce(function(a, b) {
return a + b;
})
}
return fn;
}
console.log(add(1,2,3,4));
console.log(add(1)(2,3)(4));
console.log(add(1)(2)(3)(4));
缺点是,在chrome中,此方法在每个结果之前打印一个f字符(表示一个函数),而在Firefox中,此方法不起作用,而只是作为函数打印。
function curry(fn) {
var arg = [];
return function() {
if(arguments.length === 0) {
return fn.apply(null, arg);
}
else {
arg = arg.concat(Array.prototype.slice.call(arguments));
return arguments.callee;
}
}
}
var add = curry(function() {
var arg = [].slice.call(arguments);
return arg.reduce(function(a, b) {
return a + b;
})
})
console.log(add(1, 2, 3, 4)(10, 20)()); // 40
缺点是每次使用都需要一个额外的调用,以告知该函数该调用fn的时间了,否则结果就是该函数本身。
function curry(fn, length) {
return function currying(...arg) {
if(arg.length < length) {
return function(...arg1) {
return currying.apply(this, arg.concat(arg1));
}
}
else {
return fn.apply(this, arg);
}
}
}
var add = curry(function(...arg) {
return arg.reduce(function(a, b) {
return a + b;
})
}, 4) // This 4 right here means the number of Numbers to add
缺点是您需要预先知道要添加多少个数字并将其作为参数传递给咖喱。