柯里化实现add(1)(2)(3)

433 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看: 8月更文挑战

实现函数柯里化:柯里化指的是把接收多个参数的函数转变为一个单一参数的函数。并且返回接收余下的参数且返回结果的新函数的技术。

针对题目的实现

  function add(a) {
     return function(b) {
       return function(c){
         return a+b+c
       }
     }
   }
   console.log(add(1)(2)(3))

虽然达到了我们的要求但是没有什么扩展性,只能解决这个问题。所以我们引申到直接解决柯里化问题上。

柯里化解决方案

当参数是固定的时:

首先我看到这个解法很茫然,但是仔细看来一下发现还是很妙的,他利用我们柯里化返回参数调用的特性,可以计算出前面的参数和,并且在处理函数时 返回的是我们处理函数而不是处理函数的执行,那么我们在最后肯定返回的是函数体,而不是函数的结果,所以我们就要使用toString这种在类型转换时自调用的函数来返回我们的目标值了。

看一下具体的流程:执行add(2)(3)(4)

  1. 先执行add(3),返回一个temp(n)这个函数
  2. 再来temp(4),我们这时函数执行add(3)(4),返回temp函数,此时m=7,
  3. 再来temp(5),我们这时函数执行add(7)(5),返回temp函数,此时m=12,
  4. 这时我们后面再去可以执行的函数,所以返回temp时会去执行toString函数,所以我们在toString里返回m即可。
 var add = function (m) {
     var temp = function (n) {
       return add(m + n)
     }
     temp.toString = function () {
       return m
     }
     return temp
   }
   console.log(add(3)(4)(5)); // 12

那如果参数不固定时呢?

其实原理是一样的,就是多一步我去计算参数列表和的操作。

  var add = function () {
     let arg = [...arguments].reduce((prev, next) => {
       return prev + next
     })
     var temp = function () {
       let newarg = [...arguments].reduce((prev, next) => {
         return prev + next
       })
       return add(arg + newarg)
     }
     temp.toString = function () {
       return arg
     }
     return temp
   }