js之高阶函数

126 阅读3分钟

什么是高阶函数?

首先高阶函数也是函数,但是这个函数具备如下2个特点其中一个: 1: 可以将函数作为参数传递到函数的内部; 2: 可以将函数作为返回值(即:一个函数返回另外一个函数); 只要一个函数满足这2个特点其中一个,那么这个函数就称之为高阶函数。

举例说明:

1: 将函数作为函数的参数传递到函数内部 (典型的回调)

场景:比如,我们想实现一个功能,在某个函数第三次调用的时候,输出一句话; 这个场景其实是对应我们真实开发中的,我们希望在多个接口,都返回结果以后,去执行某个业务逻辑。

场景分析: 首先我们要声明一个函数,这个函数具备需要具备2个参数: 参数一:函数的执行次数:times, 参数二:执行结束以后的callback,这个callback就是一个函数,但是这个函数是作为一个参数被传入的;

代码演示

function after(times,callback){
    return function(){
        times--;
        if(times === 0){
            callback();
        }
    }
}
let fn = after(3,function(){
    console.log('调用了3次,才执行的方法')
});

进行测试:

// 执行fn,并查看fn的执行结果
fn(); // 第一次调用,未触发callback
fn(); // 第二次调用,未出发callback
fn(); // 第三次调用,触发callback, 输出callback中的内容‘调用了3次,才执行的方法’

小结:

 根据函数可以做为参数传入的这个特点,我们在现实工作开发中,可以用于需要调 用多次才会
 执行某个函数的场景;
2: 将函数作为返回值(一个函数返回一个函数)
场景:比如我们想实现一个功能,可以用来判断一个数据的类型;

场景分析:
首先我们要声明一个函数,这个函数具备需要具备2个参数:
参数一:函数的执行次数:times,
参数二:执行结束以后的callback,这个callback就是一个函数,但是这个函数是作为一个参数被传入的;

代码演示:

function isType(content,type){
    return Object.prototype.toString.call(content) === `[object ${type}]`
}    
isType('DA','String');
isType(123,'Number');

分析:

上面的代码虽然能实现判断数据类型的功能,但是它有一个缺点,需要调用着手动传入数据类型,
那么传入的时候就会出现不小心写错的时候,所以我们对此进行改良。

改良版:

function isType(type){
  return function(content){
     return Object.prototype.toString.call(content) === `[object ${type}]` 
  }
}
let isString = isType('String');
let isNumber = isType('Number');
isString('123');
isNumber(123);

改良版的好处,调用者不用输入对象的类型,就可以直接进行判断;

现实工作中我们可能需要定义一个工具类,用来判断数据的类型,那么我们就可以这么做:

function isType(type){
  return function(content){
    return Object.prototype.toString.call(content) === `[object ${type}]` 
  }
}
let utils = {
    isString: isType('String'),
    isNumber: isType('Number'),
    isDate: isType('Date'),
    isNull: isType('Null'),
    isFunction: isType('Function'),
    isReg: isType('RegExp'),
    isObj: isType('Object')
}

进行测试:

utils.isString('123');  utils.isString(123); // true false
utils.isNumber(123);  utils.isNumber('123'); // true false
utils.isDate(new Date()); utils.isDate(123); // true false
utils.isNull(null); utils.isNull(123); // true false
utils.isFunction(isType); utils.isFunction(123); // true fasle
utils.isReg(/\d/g); utils.isReg(123); // true false
utils.isObj({}); utils.isObj(123); // true false

小结:

 当我们需要批量生成一些函数的时候,就可以利用高阶函数的特点(将函数作为返回值)

最后说一句,其实我们上面的这两个函数都有闭包的影子,所以闭包也是一种高阶函数。