一、函数式编程
什么是函数式编程(FP)?
- FP是一种编程范式,也是一种编程风格,和面向对象是并列的关系。
- FP用于描述数据或函数之间的映射;根据输入通过某种运算获得相应的输出,即映射关系,例如:y=sin(x)。
- FP需要有输入和输出,相同的输入有相同的输出(这种称之为纯函数)。所以我们可以利用这个特点重用该函数,达到代码重用的目的。
函数式编程的常见应用场景
- ES6中的map、filter、some等高阶函数。
- React的高阶组件使用了高阶函数来实现,高阶函数就是函数式编程的一个特性。Redux也使用了函数式编程的思想。
- Vue3也开始拥抱函数式编程,Vue2中也有一些高阶函数。
- Webpack打包过程中利用tree shaking过滤无用代码。
- 有很多库可以帮助我们进行函数式开发:lodash、underscore、ramda。
函数式编程的好处
- 综合高阶函数、纯函数、柯理化、函数组合等好处
二、高阶函数
什么是高阶函数?高阶函数有以下几种特性:
- 函数作为变量(函数是一等公民特性)
- 函数作为参数,例如:map、filter、some等(高阶函数特性)
- 函数作为返回值,例如:闭包、节流、防抖函数等 (高阶函数特性)
使用高阶函数的好处?
- 高阶函数可以帮助我们重用、抽象一些过程代码,让代码复用率更高
常用的高阶函数?
- forEach
- map
- filter
- every
- some
- find/findIndex
- reduce
- sort
例如:map、some、函数节流与防抖等
const map = (array, fn) => {
let results = []
for (const value of array) {
results.push(fn(value))
}
return results
}
// test
let arr = [1, 2, 3, 4]
arr = map(arr, v => v * v)
console.log(arr)
// some 判断数组中是否有一个元素满足我们指定的条件,满足是true,都不满足为false
const some = (array, fn) => {
let result = false
for (const value of array) {
result = fn(value)
// 如果有一个元素不满足就直接跳出循环
if (result) {
break
}
}
return result
}
// test
let arr = [1, 3, 4, 9]
let arr1 = [1, 3, 5, 9]
let r = some(arr, v => v % 2 === 0)
console.log(r) // true
r = some(arr1, v => v % 2 === 0)
console.log(r) // false
// once
// 函数节流,让函数只执行一次
function once(fn) {
let done = false
return function() {
// 判断值有没有被执行,如果是false表示没有执行,如果是true表示已经执行过了,不必再执行
if(!done) {
done = true
// 调用fn,当前this直接传递过来,第二个参数是把fn的参数传递给return的函数
return fn.apply(this, arguments)
}
}
}
// test
let pay = once(function (money) {
console.log(`支付:${
money} RMB`)
})
pay(5) //支付:5 RMB
pay(5)
pay(5)
pay(5)
pay(5)
三、纯函数
什么是纯函数?
- 相同的输入有相同的输出而且没有副作用,常见的纯函数slice
- 纯函数必须要有输入输出
let numbers = [1, 2, 3, 4, 5]
// 纯函数
// 对于相同的函数,输出是一样的
// slice方法,截取的时候返回截取的函数,不影响原数组
numbers.slice(0, 3) // => [1, 2, 3]
numbers.slice(0