函数式编程的核心价值是什么
函数式编程的核心价值在于它将计算视为数学函数的求值,避免使用可变数据和复杂的状态维护,从而带来了易于维护、并行编程的开发体验,具有很重要的意义。函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。

一、函数式编程的核心价值
函数式编程的核心价值在于它将计算视为数学函数的求值,避免使用可变数据和复杂的状态维护,从而带来了易于维护、并行编程的开发体验,具有很重要的意义。函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。函数式编程注重干什么而不是怎么干,更容易理解。函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试 (unit testing)和除错 (debugging),以及模块化组合。
二、函数式编程的概念
1、概念
维基百科定义:
函数式编程(英语:functional programming),又称泛函编程,是一种编程范式,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象
它属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用
2、前端中函数式编程的定义
在前端开发中,主要开发语言是javascript,而js自身并不是函数式编程语言,也就没有一个明确的定义。
在前端开发中,通常使用FP 通过声明纯函数抽象数据的处理,来避免或尽可能减少函数调用对于外部状态和系统产生的副作用,这样一种思想称为函数式编程
三、函数式编程在前端的应用
1、框架层面的应用
1.1 React函数式编程
函数式编程时react框架设计的核心思想之一,每个组件其实都是一个函数,对这些函数进行组合之后形成data和view之间的映射关系,React自身可以看作是一个ui函数,入参是data
例子:
dom函数化(jsx),react算法中的尾递归,尾调用,fiber生成算法,hooks等
1.2 vue3函数式编程
vue3新增了一个新的函数setup,类似于react的hooks
1.3 Redux函数式编程
redux是函数式编程在解决前端数据流中很典型的应用。
中间件机制(compose),纯函数Reducer,createStore(enhancer)等
1.4 Rxjs函数式编程
Rxjs是一个解决复杂异步操作的库,结合了响应式编程和函数式编程。
1.5 koa中的函数式编程
中间件的实现compose
1.6 lodash中的函数式编程
lodash中的fp模块
2、在单元测试中的应用
严格函数式编程的每一个符号都是对直接量或者表达式结果的引用,没有函数产生副作用。对被测试程序中的每个函数,只需在意其参数,而不必考虑函数调用顺序,不用谨慎地设置外部状态。所有要做的就是传递代表了边际情况的参数。如果程序中的每个函数都通过了单元测试,软件系统的质量就有了保证
3、在es6之后的应用
箭头函数
数组的扩展 find findIndex
Map数据结构
Reflect映射
对象的链判断运算符(MayBe函子) message?.body?.user?.firstName
函数扩展 尾调用优化
最新提案:函数的部分执行
gua管道运算符 >|
…
4、允许可控制的副作用共存
前端可能的副作用
更改全局状态
发送一个 http 请求
可变数据
打印/log
获取用户输入
DOM 查询
访问系统状态
在无法避免副作用的情况下,使用函子和单子来控制副作用,也包括错误的处理。
许多异步解决方案其实是函子的具体实现,比如Promise是一个Monad
四、函数式编程的优势
1. 代码简洁,开发较快
函数式编程大量使用函数,功能抽离,减少了代码的重复,代码复用性高,因此程序比较短,开发速度较快。
2. 易于理解,接近自然语言
用描述性的表达式组合不同的函数形成程序,易于理解
比如:(1 + 2) * 3 – 4 <——-> subtract(multiply(add(1,2), 3), 4)
3. 易于代码的维护和管理
函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
4. 易于”并发编程”
函数式编程不需要考虑”死锁”(deadlock),因为它不修改变量,所以根本不存在”锁”线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署”并发编程”(concurrency)
5. 易于代码升级和扩展
函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。
