2014-10-02 70 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功能。但是,如果您多次執行此操作,它將避免代碼重複。

相關問題