如何在javascript函数调用中实现任意链?

时间:2014-10-30 15:12:31

标签: javascript chaining

我已经编写了代码来实现

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

4 个答案:

答案 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

有两点需要注意:

  • 因为你正在访问参数对象,所以你真的不需要&#34;需要&#34;函数定义中的任何类型的参数列表(即你不需要a中的sum(a)),但通常认为提供一些指示是一个好主意功能期望。
  • arguments对象是array- ,如,但不是真正的数组;不要试图在它上面使用数组函数,例如push或pop,除非你想弄乱一些东西。

至于具体的sum(1)(2)语法 - 如果这非常具体你需要的话 - 我很难过。从理论上讲,要拥有这样的任意链,你需要你的函数来返回一个 一个函数和一个数字的对象......它打破了JavaScript的基本规则。如果没有一些非常聪明(可能非​​常危险)的内置对象编辑,我认为这是不可能的,除非有充分理由这样做,否则通常不赞成。