ES6如何用一句代码实现函数的柯里化

  

柯里化是干什么的?首先看看下面这个函数

        让商店=(a, b, c)=比;“这是你的七仔面”//函数就好像一个小卖部,一碗七仔面要三张软妹币:a, b, c(五个参数)   之前      

那函数柯里化是什么?就是我们买面吃的过程可能是这样:

        让curryStore=咖喱(存储)//刚刚的小卖部被柯里化了//最佳状况   curryStore(1、5、1)//老板,刚好!不用找了,刚好七块钱。老板:“这是你的七仔面”//偶尔出现的情况   让老板=curryStore(5)//老板,这五块钱你先拿着,我找找有没有一块钱。老板:……   老板=老板(1)//有了老板,这一块钱你先拿着,我找找还有没有一块钱. .老板:……   老板(1)//哈哈,终于找到了,给!老板:“这是你的七仔面”      curryStore(5)(1)(1)//等价于上诉情况      之前      

所以这里我们可以看的到,函数柯里化,是可以用来慢慢凑齐参数,延迟函数的执行。(先分期交钱,后交货!)

  


  

  

现在,我们的目标是实现一个咖喱函数,达到以下使用效果:
  在给到足够的参数时,执行函数。不够参数的时候则返回一个新的咖喱函数。

        让curryPlus=咖喱((a, b, c)=比;a + b + c)//这里给到一个有三个参数的函数      curryPlus(1)(2)(3)//返回6   curryPlus(1)(2、3)//返回6   curryPlus(1、2)(3)//返回6      让x=curryPlus(1)(2)//喂,怎么才两个参数?返回一个咖喱函数(已经带了两个参数)   x(1)//返回4   x(2)//返回5      之前      

作为一个js很厉害的人,这种问题用一行代码解决不是问题,问题是我没那么厉害…
  

  

于是,我们先从土方法说起吧下跪

  

按照咖喱的用法,原理是返回了一个函数,这个函数的参数个数不确定(你可能同时掏出两张一块的钱),于是我们可以运用不定参数的写法:

        const咖喱=(fn)=比;{   返回(…args)=祝辞{//不定参数,想给多少给多少//给钱交货环节   }   }   之前      

柯里化函数需要记住你已经给过他的参数,如果没给的话,则默认为一个空数组:

        const咖喱=(fn, arr=[])=比;{//arr数组用于记录已有参数   返回(…args)=祝辞{//给钱交货环节   }   }   之前      

接下来每次调用的时候,需要检查参数是否给够,如果够了,则执行fn,没有的话则返回一个新的咖喱函数,将现有的参数塞给他:

        const咖喱=(fn, arr=[])=比;{   返回(…args)=比;{//判断参数总数是否和fn参数个数相等   如果([…加勒比海盗,……args)。长度===fn.length) {   返回fn (…加勒比海盗,…args)//拓展参数,调用fn   其他}{   返回咖喱(fn, […加勒比海盗,……args))//迭代,传入现有的所有参数   }      }   }      之前      

到这里,其实我们已经实现了咖喱函数。

  

接下来就是要看看怎么写才能更简洁。
  首先,中间的代码可以写成一个立即执行函数,省掉一些……加勒比海盗…args:

        const咖喱=(fn, arr=[])=比;{   返回(…args)=比;{      返回(=比;{//是一个数组   如果(一个。长度===fn.length) {   返回fn (…)   其他}{   返回咖喱(fn)   }   })([…加勒比海盗,……args))//这里把加勒比海盗和args摊开成一个数组赋值给一个      }   }      之前      

如果语句可以缩减成三元表达式,也可以省掉很多字啦:

        const咖喱=(fn, arr=[])=比;{   返回(…args)=比;{      返回(=比;{      返回一个。长度===fn。长度& # 63;fn(……):咖喱(fn)      })([…加勒比海盗,……args))      }   }      之前      

最后,既然函数里啥事都没干,就只返回的是话,不妨使用箭头函数最省的写法输入=比;输出,把回报和大括号都给省了:

        const咖喱=(fn, arr=[])=比;{   返回(…args)=比;{   返回(=比;一个。长度===fn.length& # 63;fn(……):咖喱(fn,)) ((…加勒比海盗,……args))//先折叠一层   }   }   之前      

再折叠:

        const咖喱=(fn, arr=[])=比;{   返回(…args)=比;(=比;一个。长度===fn.length& # 63;fn(……):咖喱(fn,)) ((…加勒比海盗,……args))//再折叠   }   

ES6如何用一句代码实现函数的柯里化