譁眾取寵
Currying 是一個轉換函式的過程,該函式將多個引數轉換為一系列函式,每個函式只有一個引數。Currying 與部分應用有關,但不相同。
我們在 JavaScript 中考慮以下函式:
var add = (x, y) => x + y
我們可以使用 currying 的定義來重寫 add 函式:
var add = x => y => x + y
這個新版本採用單個引數 x
,並返回一個帶有單個引數 y
的函式,該引數最終將返回新增 x
和 y
的結果。
var add5 = add(5)
var fifteen = add5(10) // fifteen = 15
另一個例子是當我們有以下函式將括號括在字串周圍時:
var generalBracket = (prefix, str, suffix) => prefix + str + suffix
現在,每次我們使用 generalBracket
時我們都要傳遞括號:
var bracketedJim = generalBracket("{", "Jim", "}") // "{Jim}"
var doubleBracketedJim = generalBracket("{{", "Jim", "}}") // "{{Jim}}"
此外,如果我們傳入非括號的字串,我們的函式仍會返回錯誤的結果。我們來解決這個問題:
var generalBracket = (prefix, suffix) => str => prefix + str + suffix
var bracket = generalBracket("{", "}")
var doubleBracket = generalBracket("{{", "}}")
請注意,bracket
和 doubleBracket
現在都是等待其最終引數的函式:
var bracketedJim = bracket("Jim") // "{Jim}"
var doubleBracketedJim = doubleBracket("Jim") // "{{Jim}}"