什么是高阶函数?
首先高阶函数也是函数,但是这个函数具备如下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
小结:
当我们需要批量生成一些函数的时候,就可以利用高阶函数的特点(将函数作为返回值)
最后说一句,其实我们上面的这两个函数都有闭包的影子,所以闭包也是一种高阶函数。