一、什么是函数式编程
函数式编程(Functional Programming, FP)
,
FP
是编程范式之一,我们常听说的编程范式还有面向过程
编程、面向对象编程。
- 面向对象是把现实中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物之间的联系;
- 函数式编程是把现实世界的事物与事物之间的联系抽象到程序世界;也就是对运算过程的抽象;函数式编程指的不是程序中的函数或方法,而是数学中的函数(即映射关系),例如:y=sin(x),X与Y的关系;相同的输入始终要得到相同的输出;
-
/** * 下面实现求两个值的和 */ //面向过程 let num1 = 1; let num2 = 2; let sum = num1 + num2; //函数式编程 function add (num1, num2) { return num1 + num2; } let sum = add(1, 2);
二、为什么学习函数式编程
函数式编程思想很早之前就已经有了,为什么现在还要学习?
1、函数式编程是随着 React 的流行受到越来越多的关注(目前,我还不会这个框架,哈哈哈)
2、VUE3.0开始拥抱函数式编程
3、函数式编程可以抛弃 this
4、打包过程中可以更好的利用 tree shaking 过滤无用代码
5、方便测试、方便并行处理
6、有很多库可以帮助我们进行函数式开发:lodash、underscore、ramda
三 前置知识
1、 函数是一等公民
- 函数可以存储在变量中
- 函数可以作为参数
- 函数可以作为返回值
2、高阶函数
- 可以把函数作为参数传递给另一个函数
- 可以把函数作为另一个函数的返回结果
高阶函数是用来抽象通用的问题,使用高阶函数的意义 :可以帮我们屏蔽细节,只需要关注与我们的目标
常用的高阶函数::forEach 、map 、filter 、every 、some、 find/findIndex 、reduce 、sort ……
高阶函数--函数作为参数
下面通过模拟数组的forEach和filter,来说明函数作为参数传递给另一个函数:
// forEach 实现
function forEach (arr, callback) {
for (let i = 0; i < arr.length; i++) {
callback && callback(arr[i])
}
}
// fliter 实现
function fliter (arr, callback) {
let newArray = [];
for (let i = 0; i < arr.length; i++) {
if (callback && callback(arr[i])) {
newArray.push(arr[i]);
}
}
return newArray;
}
高阶函数---函数作为返回值
function makeFn () {
let msg = 'Hello function';
return function () {
console.log(msg)
}
}
const fn = makeFn()
fn()
高阶函数
3、闭包
可以在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域中的成员;
函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,
但是
堆上的作用域成员因为被外部引用不能释放
,因此内部函数依然可以访问外部函数的成员 。
闭包案例
// 生成计算数字的多少次幂的函数
function makePower (power) {
return function (x) {
return Math.pow(x, power)
}
}
let power2 = makePower(2)
let power3 = makePower(3)