「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」
函数柯里化
介绍
函数柯里化 ,是一种高阶函数的一种用法。
目的 就是为了 减少函数的传参,并且将一些固定的参数在函数内部私有化。
函数柯里化
在我们开发时,总会创建函数,来进行执行。可能每次不同的函数传递不同数量的参数,有些函数传递很多参数,又有很多函数几乎不需要传递什么参数。
而 函数柯里化 的作用,就是主要将本应该要接受 很多参数 的的函数。变成只需要对该函数传递 一,两 个参数达到同样的效果,多余的固定参数该函数内部调用内部函数,最后返回同样的结果。
这里给个简单的例子
我们来拼接一个网址 url
上面是我们的需求,接下来写代码,相信下面的不陌生,这个可能是我们大多数方式来写的
const concatUrl = (a,b,c) =>{
return `${a}${b}${c}`
}
concatUrl('https://','lodash.com/','docs/4.17.15#curry')
我们都知道 https:// 我们不用进行填写,那我们如何改造成函数柯里化呢?
接下来进行函数柯里化:
const concatUrl = (a) => {
return (b, c) => {
return `${a}${b}${c}`
}
}
const urlHttps = concatUrl('https://')
urlHttps('lodash.com/', 'docs/4.17.15#curry')
可以看到参数减少了一个。
复杂例子
这里再给一个关于 函数柯里化 的例子:
// currying(f) 执行柯里化转换
const currying = (f) => {
return (a) => {
return (b) => {
return f(a, b)
}
}
}
// 用法
const sum = (a, b) => {
return a + b
}
const curriedSum = currying(sum)
console.log(curriedSum(1)(2))
这里可以看到,上面的函数每次调用后,继续返回一个新的函数,直到最后返回 sum 函数。
然后就会吐槽,这么做的目的。
这里再看一下 lodash 库里面的 函数柯里化
如果应用 lodash 库 里面的 函数柯里化 的话,效果如下:
const sum = (a, b) => {
return a + b
}
let curriedSum = _.curry(sum)
console.log(curriedSum(1, 2))
console.log(curriedSum(1)(2))
从上面可以看到一个问题,就是我们写的函数柯里化,是一个不健康的,因为总不能函数内部一直这样嵌套着函数。
需要通过 apply 方法来进行。
const curry = (func) => {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args)
} else {
return function (...args2) {
return curried.apply(this, args.concat(args2))
}
}
}
}
const sum = (a, b, c) => {
return a + b + c
}
let curriedSum = curry(sum)
console.log(curriedSum(1, 2, 3))
console.log(curriedSum(1)(2, 3))
console.log(curriedSum(1)(2)(3))
总结
函数柯里化 是高阶函数,减少函数的传参,固定参数内部私有化。