哗众取宠

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)