2014-10-02 66 views
0

今天,我发现在JavaScript中加入2号的一种奇怪的方式:语法'foo(a)(b)`可能有用吗?

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

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

好吧,我得到了它。 add函数不会返回一个数字,但会返回将第一个数字与第二个数字相加的匿名函数。但是,这有什么意义(它有多大帮助)?

除了困惑其他人或编写某种混淆的恶意软件之外,它究竟有用吗?

+3

你在问什么能够返回函数的意思,或者你在问什么具有curried'add'函数的点是?这个特例可能不是最普遍有用的东西,但它不应该是。 – Ryan 2014-10-02 23:23:20

+0

我的猜测是他们认为将参数集链接在一起,而不是多次写入函数名称看起来更酷。 :) – 2014-10-02 23:24:51

+0

@minitech我在问foo(a)(b)怎么会有帮助。添加功能只是一个例子。谢谢你告诉这个技术的名字。 – 2014-10-02 23:24:58

回答

1

很显然,拨打电话add(5)(6)不是很有用 - 你宁愿写5 + 6,或者如果它真的是一个函数,add(5, 6)

最大的好处是在函数式编程中你应该传递一个函数(回调!) - 在array utils中最突出。例如:

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

你也可以用这个相当复杂功能组成,而不必处理函数表达式。如果我们没有这个咖喱add功能,在上面的例子中,我们会需要写

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

...和各个不同x每次。

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进入一些细节如何/它可以在哪里有用,以及提供几个链接来帮助解释这个概念。

+0

你好匿名downvoter - 有什么不正确或需要改进这个答案吗? – Krease 2014-10-03 17:03:30

1

让我们来看看一个函数,它是位多见于野外,pluck

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

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

这是映射对象的数组,这些对象的特定属性的数组有用:现在

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

,如果你只需要做这一个时候,有没有必要创建一个专用的pluck功能。但是,如果您多次执行此操作,它将避免代码重复。

相关问题