持续创作,加速成长!这是我参与「掘金日新计划 · 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)
}
}
}
}
柯里化函数我们就算是完结了~ 下一篇我将接着介绍组合函数