哗众取宠

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}}"