函数柯里化

97 阅读1分钟

what is Currying ?

柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。它不仅被用于 JavaScript,还被用于其他编程语言。柯里化是一种函数的转换,不会调用函数。`

柯里化应用

参数复用

tips:柯里化 count 函数,复用第一个参数

function curry(fn) {
    // 获取除 fn 之后的参数,或者初始化为空数组,用于复用参数
    const arg = [].slice.call(arguments, 1) || []

    function inner() {
        const arr = [].slice.call(arguments)
        const params = arg.concat(arr)
        
        if (fn.length > params.length) {
            // 传进来的参数比 count 需要的参数小时,还是返回 inner,让用户继续传
            return inner
        } else {
            // 参数数量满足,调用 count
            return fn.apply(null, params)
        }
    }

    // 柯里化:count 函数转化为 inner 函数
    return inner
}

function count(a,  b) {
    return a + b
}

const add = curry(count, 1)

console.log(add());  // function inner
console.log(add(1)); // 2
console.log(add(2)); // 3

实现一个 add 函数

tips:面试常考题目,本质也是对柯里化函数的一个应用

目标:add(1)(2)(3) == 6

function curry(fn) {
    const arg = [].slice.call(arguments, 1) || []

    function inner() {
        const arr = [].slice.call(arguments)
        arg.push(...arr)
        return inner
    }

    inner.toString = function() {
        return fn.call(null, arg)
    }

    return inner
}

function count(arr) {
    return arr.reduce((pre, cur) => {
        return pre + cur
    }, 0)
}

const add = curry(count)

console.log(add(1)(2)(3) == 6); // 这里不要用 ===,柯里化的函数只是返回函数的转换,我们需要使用 == 让它进行隐式调用 toString