我已经编写了代码来实现
sum(1)(2) //3
代码如下:
function sum(a) {
return function(b) {
return a+b
}
}
但是我没有解决第二个问题,即如何实现任意数量的链函数调用:
sum(1)(2) == 3
sum(5)(-1)(2) == 6
sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15
答案 0 :(得分:10)
通常你会做这样的事情:
var add = function(a,b){
return a+b;
};
var sum = function(){
return [].reduce.call(arguments, add);
}
然后你可以写:
sum(1,2,3,4); // 10
但是有可能破解你之后的功能:
var sum = function(x){
var f = function(y){
return sum(x+y);
};
f.valueOf = function(){
return x;
};
return f;
};
sum(1)(2)(3)(4); // 10
请不要在生产代码中执行此操作!
答案 1 :(得分:1)
你不能这样做 - sum
函数如何知道你是想让它返回答案还是其他函数?
你可以沿着这些方面做点什么:
sum(0)(1)(2)(3).result()
像这样实施:
var sum = (function(){
var total = 0;
var f = function(n){
total += n;
return f;
};
f.result = function(){
return total;
};
return f;
}());
答案 2 :(得分:1)
正如用户代码框已经说过:这是不可能的。
您可以做的是将函数的当前参数考虑在内。如果没有参数,您可以返回结果:
sum(1)(2)() == 3
以下是实施:
var sum = (function() {
var total = 0;
return function add(a) {
if(a === undefined) {
return total;
}
total += a;
return add;
};
}());
答案 3 :(得分:0)
有几种不同的方法来传递"任意"函数的参数量。对您的案例最有用的可能是arguments
对象。在每个函数的范围内都是一个类似于数组的对象,它包含传递给函数的所有参数。
function shout(msg) {
for (var i = 0; i < arguments.length; i++)
console.log(arguments[i]);
}
shout("This", "is", "JavaScript!"); // Logs all three strings, one line at a time
尽管看起来该函数只接受一个参数,但您可以插入尽可能多的参数,并且该函数将遍历所有参数。因此,将其转换为您的代码:
function sum(a) {
var total = 0;
for (var i = 0; i < arguments.length; i++)
total = total + arguments[i];
return total;
}
sum(1, 2); // Returns 3
有两点需要注意:
a
中的sum(a)
),但通常认为提供一些指示是一个好主意功能期望。至于具体的sum(1)(2)
语法 - 如果这非常具体你需要的话 - 我很难过。从理论上讲,要拥有这样的任意链,你需要你的函数来返回一个 一个函数和一个数字的对象......它打破了JavaScript的基本规则。如果没有一些非常聪明(可能非常危险)的内置对象编辑,我认为这是不可能的,除非有充分理由这样做,否则通常不赞成。