柯利化
关键词 把函数聚合在一起 如果一个函数参数太多 不方便聚合 保证函数参数单一
function fn1(arg) {
console.log('fn1', arg)
debugger
return arg
}
function fn2(arg) {
console.log('fn2', arg)
return arg
}
function fn3(arg) {
console.log('fn3', arg)
return arg
}
实现一个compose
// 然后实现一个compose 那compose 是一个柯利化函数吗? 应该是
const compose = (...funs) =>{
if(funs.length===0){
//这里返回一个函数 然后参数是传入的函数 把空函数返回去
return arg => arg
}
if(funs.length ===1){
return funs[0]
}
return funs.reduce((accumulator,current) => {
return function (params){
return accumulator(current(params)) // 这是一个洋葱圈模型
}
})
}
const funcitonCompose = compose(fn1,fn2,fn3)('123')
console.log('funcitonCompose',funcitonCompose)
掘金老哥的currying例子
再来一把掘金老哥的例子、
老哥先讲了currying的概念 由来
由来—是为了实现多参函数提供了一个递归降解的实现思路-- **把接受多个参数的函数变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数 **
这句话绕烂了
总结 —只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
理解不了 看老哥的例子
// 老哥: 为了实现只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数这句话描写的特性
先实现一个加法的函数
function add (x, y) {
return ( x + y)
}
现在我们直接实现一个被currying的add函数,叫currieAdd(老哥是懂语法的),则根据上面的定义currieAdd需要满足以下条件
curriedAdd(1)(3) = 4
var increment = curriedAdd(1) 这里看起来就是返回了一个新的函数 并且被奥流了crriedAdd(1) 的状态
increment(2) === 3
var addTen = curriedAdd(10)
addTen(2) === 12 //true 和increment例子一样
所以怎么满足上面的currying函数呢?
const curriedAdd = (x) => {
return function (y){
return x + y
}
}
//我靠 这就实现了? 但是只是俩层洋葱 对吧 如果三次就不行了
console.log(curriedAdd(1)(2))// 3 correct
console.log(curriedAdd(1)(2)(3)) // 三层就报错 不如compose
再看一次compose 可以接受无限个参数,执行就是拿到前一个函数结果的返回值 然后入参数作为当前函数的参数
// const compose = (...funs) =>{
// if(funs.length===0){
// //这里返回一个函数 然后参数是传入的函数 把空函数返回去
// return arg => arg
// }
// if(funs.length ===1){
// return funs[0]
// }
// return funs.reduce((accumulator,current) => {
// return function (params){
// return accumulator(current(params)) // 这是一个洋葱圈模型
// }
// })
// }