函数柯里化

243 阅读1分钟

函数柯里化

什么是函数柯里化

函数柯里化就是把一个具有n个参数的函数转变成为可以进行二次甚至n次调用执行的函数,也就是说将函数的n个参数分1~n次传入,在n个参数传入完成后一次性执行这个函数

固定参数个数函数的科柯里化

原始函数,已知参数的个数
例如:add(1, 2, 3, 4)柯里化

function add (a, b, c, d) {
    return a + b + c + d; 
}

分析:首先我们可以看出这个函数的参数长度是固定,那我们柯里化的方案是

function currying(fn) {
    const len = fn.length; // 获取原始函数参数的个数
    const args = [];
    return function _a (...param) {
        args.push(...param);
        console.log(args);
        if(args.length < len) {
            return _a;
        }
        else {
            return fn.apply(this, args.splice(0, len));
        }
    }
}

调用:

const addCurry = currying(add);
const result = addCurry(1)(2)(3)(4);

未知参数个数的函数柯里化

原始函数,不知道有多少个参数 例如:addMore(1, 2, 3 , ……, 1000, ……,n)柯里化

function addMore (...params) {
    return params.reduce((pre, next) => pre + next, 0); 
}

分析:addMore函数的参数长度是不固定,那么柯里化的方案是

function currying (fn) {
     const args = [];
     return function _a (...param) {
         
         if(param.length) {
              args.push(...param);
              return _a;
         }
         else {
             const len = args.length;
             return fn.apply(this, args.splice(0, len))
         }
     }
}
const addCurry = currying(addMore);
const result = addCurry(1,2)(12)(); // 注意最后一次调用不能有参数