主题预览

色调:

如果您使用的浏览器过时,不支持OKLCH颜色。颜色设置会不生效。

轻盈的鱼
幻想变成轻盈的鱼, 畅游在自由的海洋

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

947 字

什么是柯里化

函数柯里化(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)());