轻盈的鱼

← 返回归档

javascript 函数式编程之柯里化(currying)

日期:2018/03/14分类:javascript

什么是柯里化

函数柯里化(curry)的定义很简单:传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

js中柯里化的基本实现

1// 柯里化通用实现
2function currying(fn) {
3 var slice = Array.prototype.slice
4 var args = slice.call(arguments, 1)
5 return function () {
6 var innerArgs = slice.call(arguments)
7 var finalArgs = args.concat(innerArgs)
8 return fn.apply(null, finalArgs)
9 }
10}

通过柯里化实现阶乘的函数

1//乘积
2function tailFactorial(total, n) {
3 if (n == 1) return total
4 return tailFactorial(n * total, n - 1)
5}
6const factorial = currying(tailFactorial, 1)
7console.log(factorial(5)) //120

tailFactorial传入了两个参数,最后返回一个函数

上面的柯里化函数只能调用一次,下面对他进行改造可以调用多次

1function currying2(fn) {
2 var _args = []
3 return function cb() {
4 if (arguments.length === 0) {
5 return fn.apply(this, _args)
6 }
7 Array.prototype.push.apply(_args, arguments)
8 return cb
9 }
10}

在这个函数中,我们定义了一个\_args变量,用于记录多次调用的参数,当最后一次调用没有传入参数时才最后处理

- 下面定义一个累加函数,在这个例子中我们可以看到柯里化的一个特性--延迟求值

1//逐步求值 (延迟执行)
2function add() {
3 var sum = 0,
4 i,
5 len
6 for (i = 0, len = arguments.length; i < len; i++) {
7 sum += arguments[i]
8 }
9 return sum
10}
11const addCurry = currying2(add)
12console.log(addCurry(3)(3)(2)(1, 1, 1)())

版权信息

日期2018/03/14
协议CC BY-NC-SA 4.0 转载请注明出处
评论

暂无评论,来抢沙发吧。

返回顶部