我需要一个能够返回以下输出的函数。
add(1) = 1
add(1)(2) = 3
add(1)(2)(3) = 6
同样,函数应该返回结果。
我想要一个函数function add(){}
来执行上述任务。
请帮助我使用优化的解决方案
答案 0 :(得分:2)
感谢@ermouth initial code。
var add = (function() {
var factory = function(value) {
var fn = function(num) {
return factory(value + num);
};
// This is the main hack:
// We will return a function that when compared / concatted will call .toString and return a number.
// Never use this in production code...
fn.toString = function() {
return value;
};
return fn;
};
return factory(0);
})();
add(1); // 1
add(1); // 1
add(1)(2); // 3
add(1)(2)(3); // 6
但要注意平等比较:
add(2) == add(2) // false
add(2) > add(1) // true
add(2) < add(1) // false
答案 1 :(得分:0)
您应该将函数包装在闭包中并重新定义函数的toString
方法。
var add = (function(initNum) {
var current = initNum || 0;
var fn = function(num) {
current += num;
return fn;
};
fn.toString = function() {
return current
};
return fn;
})(0);
add(1)
→1
,然后add(2)(3)(4)
→10
答案 2 :(得分:-2)
试试这个:
function add() {
var erg = 0;
for(var i in arguments)
erg += arguments[i];
return erg;
}
您可以像添加(1,2,3);
一样调用它答案 3 :(得分:-3)
您遇到了一个技巧问题,或者您误解了问题。
你不能编写一个在纯JavaScript(或者几乎任何其他语言)中执行此操作的函数。问题是它必须在上次调用时返回一个数字,并在其他所有时间返回一个函数。 这是可行的如果你提前知道你的函数被调用多少次,但如果我正确理解你的问题,那么你事先就不知道了。你需要能够预知未来,知道最后一次调用函数的时间。
您也可以使用带有宏的语言执行此操作,以便在运行代码时检查代码的语法。这会让你知道当前的调用链有多长,所以你知道何时返回一个数字而不是一个函数。但JavaScript不会这样做;事实上,大多数语言都没有。
你的访调员是否可能正在寻找一个带有可变数量参数的add()函数?这更容易:
function add() {
return Array.prototype.reduce.call(
arguments,
function (sum, next) {
return sum + next;
},
0
);
}