高阶函数指满足下列条件之一的函数
- 函数作为参数传递
- 函数作为返回值输出
函数作为参数传递
区分不变和可变的部分,将可变的部分抽离出来,把它们放在函数参数中
一些应用场景
1. 回调函数
比如发送一个ajax请求,我们想在发送完请求后做一些事情,但是又不知道请求到底什么时候返回,所以我们可以将回调函数(callback)作为一个参数传递到ajax请求函数内,等请求完成后执行callback
不过现在有Promise、async、await等异步方案出来,ajax回调逐渐被替代
2. Array.prototype.sort
接受一个函数作为参数,里面封装了数组的排序规则
- 不变:要排序的数组
可变:排序的规则
// 从小到大排列
function sToL (a, b) {
return b - a
}
// 从大到小排列
function LTos (a, b) {
return a - b
}
函数作为返回值输出
一些应用场景
1. 判断数据的类型
2. getSingle,获取单例
const getSingle = function (fn) {
let ret
return function () {
return ret || (ret = fn.apply(this, arguments))
}
}
高阶函数实现AOP(面向切面编程)
AOP主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,通常包括日志统计、安全控制、异常处理,抽离出来后在通过“动态织入”的方式掺入业务逻辑模块;
保持业务逻辑模块的纯净和高内聚性
- 方便的复用日志统计等模块
在JavaScript中实现AOP,是指把一个函数“动态织入”到另外一个函数中