js函数有n个括号

时间:2016-10-23 17:24:41

标签: javascript web

如何使用n个括号在Javascript中定义函数。例如,如果我们有一个sum函数,我们应该能够将其称为

sum(2)(1)(5);

并且它应该返回8,其中括号的数量可以是1到n。

3 个答案:

答案 0 :(得分:0)

这应该足够接近

function sum(x) {  
   var _b = x;

   var f = function(n) {
     _b += n;
     return f;
   }

   f.valueOf = function() {
     return _b;
   }

   return f; 
}

console.log( sum(1)(2)(3) + 1 );

请注意,您可以做的最好的事情仍然需要一个技巧来从函数中获取一个值,该函数只需要返回另一个函数(这样您就可以再次调用它)。

技巧包括定义valueOf / toString,以便在必要时返回内部缓冲区的值。

答案 1 :(得分:0)

你所要求的并非完全可能。问题在于,如果你想链接函数,每个函数都必须返回一个函数。

现在你想要最后一次调用返回一个数字,但是函数如何知道何时返回最终值而不是函数?

然而,您可以将任意数量的参数传递给函数,并使用arguments访问它们。



function sum(/*num1, num2, num3, ..., numN*/) {
  return [].reduce.call(arguments, function(sum, num) {
    return sum + num;
  }, 0);
}
console.log(sum(1, 2, 3));




或者,将总和存储在外部范围中,永远不会返回值。



var sum = 0;
function add(num) {
  sum += num;
  return add;
}

add(1)(2)(3);
console.log(sum);




答案 2 :(得分:0)

在JavaScript中,一个值不能同时是一个函数和一个数字,所以你需要指出你希望在最后一个参数传递给它之后得到这个数字。

这样做的一种方法是让函数在传递它时返回sum值而不传递参数(一对额外的括号):

sum(2)(3)(6)() 

你可以这样实现:



function sum(a) {
    return b => b === undefined ? a : sum(a+b);
}

var a = sum(2)(3)(6)();

console.log(a);




正如Wictor所建议的另一种方法是使用返回的函数,它将强制转换为数字。通过定义适当的valueOf方法,您可以在发生这种情况时定义该数字应该是什么。

这可以与之前的方法结合使用,以便您可以实际选择如何获取数字值:



function sum(a) {
    var f = b => b === undefined ? a : sum(a+b);
    f.valueOf = _ => a;
    return f;
}

// method 1:
console.log(sum(2)(3)(6)());
// method 2:
console.log(+sum(2)(3)(6));




请注意,要强制使用数字值,您可以使用单一+

使用Object.assign可以在函数式编程样式中重写:



function sum(a) {
    return Object.assign(b => b === undefined ? a : sum(a+b), { valueOf: _ => a });
}

// method 1:
console.log(sum(2)(3)(6)());
// method 2:
console.log(+sum(2)(3)(6));