「前端早读君004」函数柯里化(Currying)小实践

什么是函数柯里化

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
举个例子,假设程序员A是个妻管严,工资悉数上交给妻子,为了买一个心爱的键盘
u=3317326080,3565966017&fm=27&gp=0.jpg前端

程序员A天天都偷偷藏几毛钱,打算年末买个键盘,所以程序员A写了如下这个方法用来统计年终一共凑了多少钱,方法以下:程序员

/**
 * @description 统计金额
 * @return {number}
 */
function countMoney() {
  let money = 0
  // 舒适提示:arguments是所接收的全部参数组成的类数组,不懂的须要搜一搜补补知识啦
  for (let i = 0; i < arguments.length; i++) {
    money += arguments[i]
  }

  return money
}
// 藏了一年的帐本记录的数据
const records = [1, 1, 2, 2, 3, 3, 4, 4]
// 把所有数据都输入进行计算
countMoney(1, 1, 2, 2, 3, 3, 4, 4)

上面代码所呈现的方法,是最直接的计算方法,其不方便的地方在于,程序员A还要拿个小本本把天天存了多少钱先记录下来!!!万一这个本子被发现那就少不了跪键盘了,极度不安全。
u=864471950,2685274187&fm=27&gp=0.jpg设计模式

更安全地藏私房钱

实际上,天天记录下当前的数据是不灵活的,而函数柯里化则有效地解决了这个问题。
咱们想要这样存储咱们的私房钱数组

// 2018-01-01 存了1毛钱
countMoney(1)
// 2018-01-02 存了2毛钱
countMoney(2)
// 2018-01-03 存了3毛钱
countMoney(3)
// 2018-01-04 存了4毛钱
countMoney(4)
//一年之后
// 统计这笔巨额存款
countMoney()

上述的这种方法中,咱们不关心数据的存储记录,咱们只须要天天往存钱罐里面塞钱,而后年末取出来就是一个总和。不再担忧留下小本本做为证据了!安全

函数柯里化代码的实现

/**
 * @description countMoney为当即执行函数,返回的结果是另外一个函数
 */
const countMoney = (function () {
  let money = 0
  let args = []
  const res = function () {
    if (arguments.length === 0) {
      for (let i = 0; i < args.length; i++) {
        money += args[i]
      }
      return money
    } else {
      // arguments 是个类数组来着,应该用展开符展开才能push进去
      args.push(...arguments)
      return res
    }
  }
  return res
})()

// 2018-01-01 存了1毛钱
countMoney(1)
// 2018-01-02 存了2毛钱
countMoney(2)
// 2018-01-03 存了3毛钱
countMoney(3)
// 2018-01-04 存了4毛钱
countMoney(4)
//一年之后
// 统计这笔巨额存款 输出结果为 10
console.log(countMoney())
// 你还能够装逼地进行花式统计,结果一样是10
countMoney(1)(2)(3)(4)()

分析代码

实际上,在JavaScript的不少思想和设计模式中,闭包是个很常见且很重要的东西,上述的代码中,本质上就是利用了闭包。
该函数是个当即执行函数,返回了一个新函数,而这个新函数实际上就是一个闭包,这个新函数把每次接收到的参数都存储起来,
而且继续返回一个新函数,当发现某次调用的时候没有传入参数,那就意味着要进行数据统计,从而把以前存储的数据一次性拿
出来计算,最后返回计算结果。其流程以下:
5b6d0ab0e4b053a09c2e0a95.png微信

总结

所谓的函数柯里化,亦或者在开发中涉及到的其余一些概念,例如闭包、单例模式、观察者模式等等都好,咱们须要关注的点在于掌握
这些模式或者概念中的代码设计思想,从而更好地服务于咱们的业务开发,让咱们的代码更健壮、灵活、高效。闭包

图片描述

获取更多知识,请微信扫码关注公众号关注早读君,天天早晨为你推送前端知识,度过挤地铁坐公交的时光。
并且不定时举办活动赠送书籍哦函数

相关文章
相关标签/搜索