柯里化&compose尝试

柯利化

关键词 把函数聚合在一起 如果一个函数参数太多 不方便聚合 保证函数参数单一

  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))  // 这是一个洋葱圈模型
    //         }
    //     })
    // }

你可能感兴趣的:(javascript,前端,json)