语法“foo(a)(b)”如何有用

How might the syntax `foo(a)(b)` be useful?

本文关键字:何有用 有用 语法 foo      更新时间:2023-09-26

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

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

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

好的,我明白了。add函数不返回数字,而是返回将第一个数字与第二个数字相加的匿名函数。但这有什么意义(它如何有帮助)?

除了让其他人感到困惑或编写某种模糊的恶意软件之外,它到底在哪里有用?

显然,调用add(5)(6)并不太有用——您宁愿编写5 + 6,或者,如果它真的是一个函数,则编写add(5, 6)

最大的好处是在函数式编程中,您应该传递一个函数(callback!),这在数组utils中最为突出。例如:

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

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

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

…并且每次对于每个不同的CCD_ 7。

让我们看看一个在野外更常见的函数pluck:

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

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

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

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

现在,如果只需要一次性执行此操作,则无需创建专用的pluck函数。但是,如果多次执行此操作,则可以避免代码重复。

您不一定会像前面描述的那样使用它,但如果您想传递一个"给结果加5"的函数,您可以执行

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

这种"部分"函数调用的技术被称为currying——另一个SO问题详细介绍了它如何/在哪里有用,并提供了几个链接来帮助解释这个概念。