Skip to content
On this page

高阶函数

满足下列条件之一的函数可以称为高阶函数:

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

函数作为参数传递

情况一:回调函数

应用于异步请求中或者需要委托另一个函数执行。

//给100个div节点添加display:none
//我们可以将display:none这个具体的需求抽离出来
let appendDiv = function (callback) {
  for (let i = 0; i < 100; i++) {
    let div = document.createElement('div');
    div.innerHTML = i;
    document.body.appendChild(div);
    if (typeof callback === 'function') {
      callback(div);
    }
  }
};

appendDiv(function (node) {
  node.style.display = 'none';
});

情况二:Array.property.sort

接收一个函数作为参数,规定数组元素的排序顺序。

//从大到小排列
[1, 2, 3, 4].sort(function (a, b) {
  return b - a;
})

函数作为返回值输出

情况一:判断数据的类型

let isType = (type) => {
  return (data) => {
    return Object.prototype.toString.call(data) === '[object ' + type + ']';
  }
}

let isString = isType('String')
let isArray = isType('Array')
let isNumber = isType('Number');

console.log(isArray([1, 2, 3]))
console.log(isNumber(2))
console.log(isString('2'));

情况二:单例模式

//接收一个函数,包含一个内部变量
//当变量存在时,直接返回;不存在时, 调用函数并将传进来的函数作为函数的参
let getSingle = (fn) => {
  let instance;
  return function () {
    return instance || (instance = fn.apply(this.arguments));
  };
};

let getObject = getSingle(function () {
  return {
    count: 1,
  };
});

let obj1 = getObject();
let obj2 = getObject();
console.log(obj1 === obj2);

情况三:实现AOP

AOP:面向切面编程,将跟核心业务逻辑模块无关的功能抽离出来,包括日志统计、安全机制、异常处理等。

可以保持业务逻辑模块的纯净和高内聚性,可以方便地复用日志统计等功能模块。


MIT Licensed | Copyright © 2021 - 2022