最简版js函数柯里化实现

52 阅读1分钟

话不多说,直接上代码

/**
* @description 接受一个函数,返回一个新函数,当累计的参数数量等于原函数参数数量时,执行原函数
* @params fn: Function 需要柯里化的函数
* @returns fn: Function 柯里化后的函数
*/
const curried = function (fn, ...args) {
    // 这里的params表示柯里化后的函数接受的参数,这个参数的数量是不确定的
    return function(...params) {
        // 拼接参数,把每次调用函数的参数组合到一起,最终会和原函数一致
        const currentArgs = [...args, ...params];
       // 当累计的参数数量大于等于原函数参数数量时,执行原函数,小于时保存参数并继续调用柯里化函数
        if(currentArgs.length >= fn.length) {
             fn.apply(this, currentArgs)
        } else {
            // currentArgs也在递归调用自身的时候保存所有参数
            return curried.call(this, fn, ...currentArgs)
        }
    }
}

// 测试
const getVal = function(a, b, c, d) {
    console.log(a, b, c, d)
}
const curriedFn = curried(getVal);
curriedFn(1, 2)(3)(4) // 1,2,3,4;

个人的一点小见解,要了解一个事物,我们应该要解他的作用和概念,然后用自己话去尝试着描述他的过程,把自己的理解和他的实现一步一步进行对照,最后再尝试自己去实现