哗众取宠
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)
。