理解JavaScript的纯函数、柯里化与组合函数

161 阅读3分钟

理解JavaScript函数

函数式编程中有一个非常重要概念就是纯函数,js符合函数式编程范式,所以也有纯函数的概念,其在维基百科定义如下。

  • 在程序设计中,若一个函数符合以下条件,那么就是纯函数
  • 此函数在相同的输入值时,需产生相同的输出
  • 函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关。
  • 该函数不能有语义上可观察的函数副作用,例“触发事件”,使输出设备输出,或更改输出值以外物价的内容等。

简而言之,就是

  • 在确定的输入下,一定会产生确定的输出
  • 函数在执行过程中,不能产生副作用

那么副作用又是什么呢? 副作用就是表示在执行一个函数时,除了返回函数值以外,还对调用函数产生了附加的影响,比如修改了全局变量,修改了参数或者改变了外部存储。

纯函数案例 两个对数组操作的函数:

  • slice:slice截取数组不会对原数组进行任何操作,而是生成新数组,其是纯函数。
  • splice截取数组,会返回新数组,同时对原数组进行修改,其不是纯函数。

纯函数的优势

  • 可以安心编写安心使用
  • 你在写的时候,只是单纯实现自己的业务逻辑即可,不需要关心传入的内容是如何来的或者依赖其他的外部变量是否发生了修改
  • 在确定你的输入内容不变时,并且自己确定的输入,一定会有确定的输出
  • 例,react组件就必须像纯函数一样让自己的参数props不受修改

理解JavaScript柯里化

让我们先看看柯里化在维基百科的解释:

  • 柯里化(Currying):又译为卡瑞化或者加里化
  • 是把接受多个参数的函数,变成接受一个单个参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术
  • 柯里化声称"如果你固定某些参数,你将得到接受余下参数的一个函数"

简而言之,就是 只传递给函数一部分参数来调用它,让它返回一个函数去处理余下的参数,这个过程称之为柯里化

柯里化的作用

  • 让函数职责单一,我们往往希望一个函数处理的问题尽可能单一,而不是将一大堆处理过程扔给一个函数来处理
  • 可以帮助我们复用参数逻辑

理解组合函数

组合函数是在JavaScript开发过程中一种对函数的使用技巧、模式:

  • 比如我们需要对某一个数据进行函数的调用,执行两个函数,且是依次执行的
  • 那么如果每次我们都需要进行两个函数的调用,操作就会显得重复
  • 那么是否可以将这个两个函数组合起来,自动依次调用
  • 这个过程就是对函数的组合,我们称之为组合函数(compose Function)