句法`foo(a)(b)`有用吗?

时间:2014-10-02 23:19:34

标签: javascript

今天我发现了一种在javascript中添加2个数字的奇怪方法:

基本上,方法的调用是这样的:add(5)(6)并且方法的声明是:

function add(x) {
  return function(y) { return x + y; };
}

好的,我明白了。 add函数不返回数字,但返回匿名函数,该函数将第一个数字与第二个数字相加。但重点是什么(它如何有用)?

除了困惑别人或编写某种混淆的恶意软件外,它究竟能用于什么?

3 个答案:

答案 0 :(得分:1)

让我们看一下在野外更常见的函数,pluck

function pluck(prop) {
    return function(obj) {
        return obj[prop];
    }
}

此函数接受属性名称并返回一个新函数,给定一个对象,该函数返回该对象的属性。

这对于将对象数组映射到这些对象的特定属性的数组非常有用:

var names = people.map(pluck('name'));

现在,如果您只需要一次执行此操作,则无需创建专用的pluck功能。但是,如果多次执行此操作,则会避免重复代码。

答案 1 :(得分:1)

显然,来电add(5)(6)并不太有用 - 您宁愿写5 + 6,或者,如果它真的是一个功能,add(5, 6)

功能性编程的好处在于你应该传递一个函数(回调!) - 在array utils中最为突出。例如:

[1, 2, 3].map(add(5)) // [6, 7, 8]

您还可以将此用于相当复杂的函数的组合,而无需处理函数表达式。如果我们没有这个curry add函数,在上面的例子中我们需要编写

[1, 2, 3].map(function(y) {
     return 5 + y;
}) // [6, 7, 8]

......并且每次都有不同的x

答案 2 :(得分:0)

你不一定会像你所描述的那样使用它,但是如果你想要传递一个“为结果添加5”的函数,你可以做到

var addsFive = add(5);
// some other code, perhaps passing this var to another function
var result = addsFive(6); // returns 11

这种“部分”函数调用技术称为currying - this other SO question详细介绍了它如何/在哪里有用,并提供了几个链接来帮助解释这个概念。