作为函数式编程语言,JS带来了很多语言上的有趣特性,比如柯里化和反柯里化。
这里可以对照另外一篇介绍 JS 反柯里化 的文章一起看~
1. 简介
柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
核心思想是把多参数传入的函数拆成单参数(或部分)函数,内部再返回调用下一个单参数(或部分)函数,依次处理剩余的参数。
按照Stoyan Stefanov --《JavaScript Pattern》作者 的说法,所谓“柯里化”就是使函数理解并处理部分应用
柯里化有3个常见作用:
- 参数复用
- 提前返回
- 延迟计算/运行
talk is cheap,看看怎么实现吧~
2. 实现
2.1 通用实现
一个通用实现:
function currying(fn, ...rest1) {
return function(...rest2) {
return fn.apply(null, rest1.concat(rest2))
}
}
注意这里concat接受非数组元素参数将被当做调用者的一个元素传入
用它将一个sayHello函数柯里化试试:
function sayHello(name, age, fruit) {
console.log(console.log(我叫 ${name},我 ${age} 岁了, 我喜欢吃 ${fruit}
))
}
const curryingShowMsg1 = currying(sayHello, ‘小明’)
curryingShowMsg1(22, ‘苹果’) // 我叫 小明,我 22 岁了, 我喜欢吃 苹果
const curryingShowMsg2 = currying(sayHello, ‘小衰’, 20)
curryingShowMsg2(‘西瓜’) // 我叫 小衰,我 20 岁了, 我喜欢吃 西瓜