函数式编程:一种"编程范式", 也可称为如何编写程序的方法论。主要思想:把运算过程尽量写成一系列嵌套的函数调用。
- 随着 React 的广泛使用,函数式编程也开始被大家熟知。
- 在使用 Vue3 的过程中,使用函数式编程更为简洁方便。
- 进行函数式开发的库有: lodash、underscore、ramda...
优点
- 在项目打包时可以更好的利用 tree sharking 过滤无用代码。
- 函数式编程可以抛弃 this (?)。
- 代码变得简洁,复用率增高。
Tree sharking : 一种通过消除最终文件中未使用的代码来优化体积的方法
相关定义
- 思维方式:把现实世界的事物和事物之间的联系抽象到程序世界。
- 本质:根据输入通过某种运算获得相应的输出。
- 函数式编程用来描述 数据(函数)之间的映射
eg:x -> f(联系、映射) -> y,y=f(x)
特性
1. 函数是"一等公民"
"一等公民" 是指函数与其他数据类型一样,处于平等地位。可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
var testFn = function (val) { console.log('fn', val); };
[1,2,3,4,5,6].forEach(testFn)
2. 没有 " 副作用 "
副作用: 指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
使用
1. 纯函数
checkAge (minAge, userAge) {
return userAge >= minAge
}
纯函数: 相同的输入始终要得到相同的输出,而且没有任何可观察的 副作用。
副作用:如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。副作用也使得方法通用性下降,不适合扩展和可重用性。
- 可缓存结果
- 相同的输入值得到的结果始终相同。在多次调用同一纯函数时,相同的输入值仅在第一次时进行方法调用,之后则返回缓存结果。
- 方便测试
- 并行处理
- 在多线程环境下并行操作共享的内存数据很可能会出现意外情况
- 纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数 (Web Worker)
2. 高阶函数
在函数式编程中,如果函数能满足下面任一要求就可以被称为 高阶函数(higher-order function):
- 接受至少一个函数作为参数
- 返回的结果是一个函数
常用的高阶函数:forEach、map、filter、every、some、 find/findIndex、reduce、 sort
3.柯里化
柯里化: 当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后永远不变),然后返回一个新的函数接收剩余的参数,返回结果。
checkAge (minAge) {
return ((userAge) => {
return userAge > minAge
})
}
console.log(this.checkAge(18)(22)) // true
lodash 中的柯里化函数 : _.curry(func)