265 words
|
4.42 分钟
javascript 函数式编程之柯里化(currying)
2018-03-14
什么是柯里化
函数柯里化(curry)的定义很简单:传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
js中柯里化的基本实现
// 柯里化通用实现
function currying(fn) {
var slice = Array.prototype.slice
var args = slice.call(arguments, 1)
return function () {
var innerArgs = slice.call(arguments)
var finalArgs = args.concat(innerArgs)
return fn.apply(null, finalArgs)
}
}
通过柯里化实现阶乘的函数
//乘积
function tailFactorial(total, n) {
if (n == 1) return total
return tailFactorial(n * total, n - 1)
}
const factorial = currying(tailFactorial, 1)
console.log(factorial(5)) //120
tailFactorial
传入了两个参数,最后返回一个函数
上面的柯里化函数只能调用一次,下面对他进行改造可以调用多次
function currying2(fn) {
var _args = []
return function cb() {
if (arguments.length === 0) {
return fn.apply(this, _args)
}
Array.prototype.push.apply(_args, arguments)
return cb
}
}
在这个函数中,我们定义了一个_args变量,用于记录多次调用的参数,当最后一次调用没有传入参数时才最后处理
- 下面定义一个累加函数,在这个例子中我们可以看到柯里化的一个特性--延迟求值
//逐步求值 (延迟执行)
function add() {
var sum = 0,
i,
len
for (i = 0, len = arguments.length; i < len; i++) {
sum += arguments[i]
}
return sum
}
const addCurry = currying2(add)
console.log(addCurry(3)(3)(2)(1, 1, 1)())