一:概念

   面向函数的编程,着眼于函数,强调的是如何通过函数的组合变换去解决问题。

二:特点

  1.函数是一等公民:

    函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

  2.无状态和数据不可变: 

    无状态:强调对于一个函数,不管你何时运行,它都应该像第一次运行一样,给定相同的输入,给出相同的输出,完全不依赖外部状态的变化。

    数据不可变:要求你所有的数据都是不可变的,这意味着如果你想修改一个对象,那你应该创建一个新的对象用来修改,而不是修改已有的对象。

  3.没有副作用:

    只根据输入返回结果,不改变外界的数据,保证了数据的不可变性,还能避免很多因为共享状态带来的问题。

  4.纯函数:

    函数的的运行结果不依赖全局变量,this 指针,IO 操作等;不修改全局变量,不修改入参;相同的输入,永远会得到相同的输出。

 四:使用

  函数式编程需要用到  柯里化curry() 和组合函数 compose()  常用工具库有Lodash 和 Ramda (更推荐使用,因为里面的函数都是柯里化的)

五:函数式编程优点

 

  1.更好的管理状态:因为它的宗旨是无状态,或者说更少的状态,能最大化的减少这些未知、优化代码、减少出错情况

  2.更简单的复用:固定输入->固定输出,没有其他外部变量影响,并且无副作用。这样代码复用时,完全不需要考虑它的内部实现和外部影响

  3.更优雅的组合:往大的说,网页是由各个组件组成的。往小的说,一个函数也可能是由多个小函数组成的。更强的复用性,带来更强大的组合性

  4.代码简洁,出错率小:因为每个函数都很小,而且相同输入永远可以得到相同的输出,因此测试很简单,同时函数式编程强调使用纯函数,没有副作用,因此也很少出现奇怪的 Bug

六:函数式编程缺点

  1.性能:函数式编程相对于指令式编程,性能绝对是一个短板,因为它往往会对一个方法进行过度包装,从而产生上下文切换的性能开销

  2.资源占用:在 JS 中为了实现对象状态的不可变,往往会创建新的对象,因此,它对垃圾回收所产生的压力远远超过其他编程方式

  3.递归陷阱:在函数式编程中,为了实现迭代,通常会采用递归操作

 

参考链接:https://juejin.cn/post/6844903936378273799#heading-32