如何编写如下函数?
add(num1)(num2)(num3)...
示例:
add(10)(10)=20
add(10)(20)(30)=60
add(10)(20)(30)(40)=100
我怎样才能实现这个功能?
答案 0 :(得分:3)
我不知道你为什么要创建这样的功能。不过,我会写如下:
alert(add(10)(10)); // 20
alert(add(10)(20)(30)); // 60
alert(add(10)(20)(30)(40)); // 100
function add(x) {
adder.toString = adder.valueOf = result;
return adder;
function adder(y) {
return add(x + y);
}
function result() {
return x;
}
}

它是如何运作的?
add(10)
时,结果为function adder(y) { return add(10 + y); }
。这允许您链接add
函数,在移动时累积总和。因此,您可以编写add(10)(20)(30)(40)
。结果始终是一个功能。toString
和valueOf
函数强制转换为数字,只要预期基元而不是对象,JavaScript函数会自动调用这些函数。因此,您始终可以将结果函数视为数字,从而可以编写5 * add(10)(10)
等表达式。有什么好处?
与A.J's solution相比,我们没有使用任何可变状态。因此,每次要创建新链时,都不需要将计数器变量c
重置为零。此外,您可以保存任何中间值并在以后使用它而不必担心它会改变:
var a = add(10)(20)(30); // 60
var b = a(40); // 100
alert(a); // still 60
与Darshan N Reddy's solution(也使用可变状态)相比,我们不需要在链的末尾进行最终.res()
方法调用以获得结果(尽管我们可以在最后写.valueOf()
。由于JavaScript解释器会自动调用toString
和valueOf
,因此您只需将生成的函数视为数字。
希望有所帮助。但是,我仍然没有看到编写这些功能的必要性。你的实际用例是什么?
答案 1 :(得分:1)
您只需要返回功能:
var c = 0;
var div = document.querySelector("div");
function add(value) {
c += value;
div.innerHTML = c;
return add;
}
add(10)(20)(30);
<div></div>
每次调用函数时都要c = 0
来获得正确的答案。
答案 2 :(得分:0)
这可以通过在javascript中使用闭包来实现。
function add(x){
return function(y){
return x + y;
};
}
在上面的代码中,对函数的第一次调用返回一个函数,该函数接受一个参数,并且由于x的闭包值仍然可用于内部函数,因此它返回x和y的总和。
add(10)(10); //return 20
如果你想让3个电话真实,那么
function add(x){
return function(y){
return function(z){
return x+y+z;
};
};
}
由于您希望使用无限数量的呼叫,而您事先不知道,您可以进行黑客攻击并使其正常工作,
function sum(x) {
var sum = x;
function func(y) {
sum =sum+y;
return func;
}
func.res = function() { return sum } //this is the hack
return func;
}
在添加时,您可以调用
sum(45)(4)(1).res();