柯里化

51 阅读1分钟

前置

1. 需要了解Function.length,它旨在收集fn的形参,且不包含指定默认值之前的形参。
    
function fn1 () { } // 0
function fn2 (name) { } // 1
function fn3 (name, age) { } // 2function fn4 (name = 'test') { } // 0
function fn5 (name, age = 18) { } // 1
function fn6 (name, age = 18, gender) { } // 1
function fn7 (name = 'test', age, gender) { } // 0 
2. 柯里化指收集足够的参数后执行对应的方法--柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

具体实现


function add(a, b, c, d,e) {
    return a + b + c + d+e;
}
function currying(fn,) {
    let fnlength = fn.length;
    let args1 = [...arguments].slice(1);

    return function () {
        let args2 = [...args1, ...arguments];
        if (args2.length < fnlength) {
            return currying.call(this,fn,...args2);

        }else {
            return fn.apply(this,args2);
        }
    }
}
let temp1 = currying(add);
console.log(temp1(1)(2)(3,4)(5));
console.log(temp1(1,2,3,4,5));