javascript 函数式编程之柯里化(currying)
什么是柯里化
函数柯里化(curry)的定义很简单:传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
js中柯里化的基本实现
1// 柯里化通用实现2function currying(fn) {3 var slice = Array.prototype.slice4 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 total4 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 cb9 }10}
在这个函数中,我们定义了一个\_args变量,用于记录多次调用的参数,当最后一次调用没有传入参数时才最后处理
- 下面定义一个累加函数,在这个例子中我们可以看到柯里化的一个特性--延迟求值
1//逐步求值 (延迟执行)2function add() {3 var sum = 0,4 i,5 len6 for (i = 0, len = arguments.length; i < len; i++) {7 sum += arguments[i]8 }9 return sum10}11const addCurry = currying2(add)12console.log(addCurry(3)(3)(2)(1, 1, 1)())
暂无评论,来抢沙发吧。