函数柯里化4

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

说点题外话

受背景疫情的影响,本人已经居家一周了,这一周里复盘了之前了之前一直想学但是没时间学的东西,省下来地铁时间就是爽啊~, 咳咳~进入正题吧

之前的几篇里面,我们都是对指定的函数进行柯里化,那么就会有人问了,我们要是有10哥函数想柯里化,还得写10个柯里化函数吗?当然不是,我们可以选择封装一个通用的呀~

实现柯里化函数

目的:传入一个普通函数,将一个普通函数变成柯里化函数 这里是一个普通函数sum

function sum(x, y, z) {
 return x + y + z
}

我们想要将这个函数sum变成一个柯里化函数,我们就可以将这个sum函数作为参数进行处理。fn作为sum的形参,柯里化函数需要返回一个新的函数curried用来作为调用函数。函数sum可能会接收很多个参数,所以我们的函数curried负责接收sum的参数,可以使用扩展运算符来接收。

fucntion myCurrying (fn){
    return function curried (...args){}
}

var myFn = myCurrying(sum)

假设柯里化函数是下面这样调用的,也就是一次性将函数sum需要的参数都传递了

var myFn = myCurrying(sum)
result(1, 2, 3)

那么我们就可以判断,判断当前柯里化函数myCurrying接收的参数和函数sum本身需要的参数数量事都相同,如果相同就可以直接调用函数返回出去。

fucntion myCurrying (fn){
    return function curried (...args){
        if (fn.length === args.length){
             return fn(...args)
        }
    }
}

我们可以考虑的再多一点,如果我们调用的时候改变this的指向呢,如果我们这样调用

result.call("abc",1, 2, 3)

那么我们就需要将this始终绑定到调用函数fn上面

fucntion myCurrying (fn){
    return function curried (...args){
        if (fn.length === args.length){
             // return fn.apply(this, args)
             return fn.call(this, ...args)
        }
    }
}

我们思考另一种调用情况,假设我们是这样调用的

result(1)(2)(3)

也就是函数curried接收到的参数和函数本身需要接收的参数数量不同,我们就可以使用迭代将所有参数拼接成完整的参数返回。参数args2就是接收的第二个参数,第三个参数等等。别忘记将this绑定到返回函数上面。

fucntion myCurrying (fn){
    return function curried (...args){
        if (fn.length === args.length){
             // return fn.apply(this, args)
             return fn.call(this, ...args)
        }else{
            return function (...args2){
                // reuturn curried.apply(this, [...args, ...args2])
                return curried.call(this, ...args, ...args2)
            }
        }
    }
}

完整代码

fucntion myCurrying (fn){
    return function curried (...args){
        if (fn.length === args.length){
             // return fn.apply(this, args)
             return fn.call(this, ...args)
        }else{
            return function (...args2){
                // reuturn curried.apply(this, [...args, ...args2])
                return curried.call(this, ...args, ...args2)
            }
        }
    }
}

柯里化函数我们就算是完结了~ 下一篇我将接着介绍组合函数