高阶函数指满足下列条件之一的函数

  • 函数作为参数传递
  • 函数作为返回值输出

函数作为参数传递

区分不变和可变的部分,将可变的部分抽离出来,把它们放在函数参数中

一些应用场景

1. 回调函数

比如发送一个ajax请求,我们想在发送完请求后做一些事情,但是又不知道请求到底什么时候返回,所以我们可以将回调函数(callback)作为一个参数传递到ajax请求函数内,等请求完成后执行callback

不过现在有Promise、async、await等异步方案出来,ajax回调逐渐被替代

2. Array.prototype.sort

接受一个函数作为参数,里面封装了数组的排序规则

  • 不变:要排序的数组
  • 可变:排序的规则

    1. // 从小到大排列
    2. function sToL (a, b) {
    3. return b - a
    4. }
    5. // 从大到小排列
    6. function LTos (a, b) {
    7. return a - b
    8. }

    函数作为返回值输出

    一些应用场景

    1. 判断数据的类型

    2. getSingle,获取单例
    1. const getSingle = function (fn) {
    2. let ret
    3. return function () {
    4. return ret || (ret = fn.apply(this, arguments))
    5. }
    6. }

    高阶函数实现AOP(面向切面编程)

    AOP主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,通常包括日志统计、安全控制、异常处理,抽离出来后在通过“动态织入”的方式掺入业务逻辑模块;

  • 保持业务逻辑模块的纯净和高内聚性

  • 方便的复用日志统计等模块

    在JavaScript中实现AOP,是指把一个函数“动态织入”到另外一个函数中

高阶函数其他应用

函数柯里化(currying)

节流

分时

惰性加载函数