在最近的一次采访中,我被要求创建下面的代码片段中描述的功能
add(2,3,4)(5,6)(7,8); // Should yield 35
如上面的代码片段所示,有一个名为“ add”的函数可以无限调用,每次调用可以容纳无限个参数。最后,它应该返回所有调用中所有参数的总和。
下面是部分解决方案,它要求不带参数的最终调用。
/**
* @description
* infiniteAdd(2,3)(4,5)(6,7)()
* Above operation yields 27
*/
function infiniteAdd() {
// Creating closure for subsequent function invocations
var prevArgs = Array.prototype.slice.call(arguments);
return function() {
var currArgs = Array.prototype.concat.call(prevArgs, Array.prototype.slice.call(arguments));
if (arguments.length < 1) {
// if no arguments than calculate sum
return Array.prototype.reduce.call(currArgs,
function(acc, curr) {
return acc + curr;
}
);
}
// Recursively call the main function till no more arguments provided
return infiniteAdd.apply(null, currArgs);
}
}
console.log(infiniteAdd(2, 3)(4, 5)(6, 7)());
答案 0 :(得分:1)
您可以像下面那样实现currying功能进行添加
function addition(...args) {
return args.reduce((a, b) => a + b)
}
function parseAdd(fn) {
var newFn = fn.bind(null);
function cal(...args) {
newFn = newFn.bind(null, ...args);
return cal;
}
cal.toString = () => newFn();
return (...arg) => {
newFn = fn.bind(null);
return cal(...arg)
}
}
var add = parseAdd(addition)
console.log(add(2, 3, 4)(5, 6)(7, 8))