简单实现curry(柯里化)

158 阅读1分钟

柯里化:柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,如果其他的参数是必要的,返回接受余下的参数且返回结果的新函数。

    const add  = (a, b, c) => a + b + c;
    
    function curry(fn) {
        let allArgs = [];
        let len = fn.length;

        // 闭包:访问函数外的变量allArgs
        // 通过闭包,将每次的参数保存在allArgs数组中
        return function next(...args) {
            // 收集每次的参数
            allArgs = allArgs.concat(args);
            if (allArgs.length >= len) {
                // 清空allArgs数组
                let temp = allArgs
                allArgs = []
                // 所有参数拼接完,运行add函数
                return fn(...temp)
            } else {
                // 参数未接受完,继续接受参数
                return next;
            }
        }
    }
    let curriedAdd = curry(add)
    console.log(curriedAdd(1, 2)(3)) // 6
    console.log(curriedAdd(1)(2)(3)) // 6
    console.log(curriedAdd(1)(2, 3)) // 6