譁眾取寵

Currying 是一個轉換函式的過程,該函式將多個引數轉換為一系列函式,每個函式只有一個引數。Currying 與部分應用有關,但不相同。

我們在 JavaScript 中考慮以下函式:

var add = (x, y) => x + y

我們可以使用 currying 的定義來重寫 add 函式:

var add = x => y => x + y

這個新版本採用單個引數 x,並返回一個帶有單個引數 y 的函式,該引數最終將返回新增 xy 的結果。

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("{{", "}}")

請注意,bracketdoubleBracket 現在都是等待其最終引數的函式:

var bracketedJim = bracket("Jim") // "{Jim}"
var doubleBracketedJim = doubleBracket("Jim") // "{{Jim}}"