今天我发现了一种在javascript中添加2个数字的奇怪方法:
基本上,方法的调用是这样的:add(5)(6)
并且方法的声明是:
function add(x) {
return function(y) { return x + y; };
}
好的,我明白了。 add
函数不返回数字,但返回匿名函数,该函数将第一个数字与第二个数字相加。但重点是什么(它如何有用)?
除了困惑别人或编写某种混淆的恶意软件外,它究竟能用于什么?
答案 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详细介绍了它如何/在哪里有用,并提供了几个链接来帮助解释这个概念。