譁眾取寵
Currying 是將 n
arity 或 arguments 的函式轉換為僅採用一個引數的 n
函式序列。
用例:當某些引數的值在其他引數之前可用時,你可以使用 currying 將函式分解為一系列函式,以便在每個值到達時分階段完成工作。這可能很有用:
- 當引數的值幾乎從不改變時(例如,轉換因子),但是你需要保持設定該值的靈活性(而不是將其硬編碼為常量)。
- 當其他 curried 函式執行之前,curried 函式的結果有用。
- 驗證功能是否按特定順序到達。
例如,矩形稜鏡的體積可以通過三個因素的函式來解釋:長度(l
),寬度(w
)和高度(h
):
var prism = function(l, w, h) {
return l * w * h;
}
這個函式的 curried 版本看起來像:
function prism(l) {
return function(w) {
return function(h) {
return l * w * h;
}
}
}
Version >= 6
// alternatively, with concise ECMAScript 6+ syntax:
var prism = l => w => h => l * w * h;
你可以使用 prism(2)(3)(5)
呼叫這些函式序列,其值應為 30。
如果沒有一些額外的機制(比如庫),由於缺少佔位符值,curry 在 JavaScript(ES 5/6)中的語法靈活性有限; 因此,雖然你可以使用 var a =
prism(2)(3)
建立部分應用的功能 ,但你不能使用 prism()(3)(5)
。