vlambda博客
学习文章列表

一文搞懂JavaScript高阶函数

1. 什么是高阶函数

高阶函数也称算子(运算符)或泛函。作为函数式编程最显著的特征,高阶函数是对函数运算进行进一步的抽象。

维基百科对于 高阶函数 的定义:

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

  1. 接受一个或多个函数作为输入

  2. 输出一个函数

2. 实现一个高阶函数
举个平常开发中我们经常会遇得到的例子:
判断一个数据是否是某某类型,如判断 "1" 是否是 String 类型,123 是否是 Number 类型等等,你可能会想到这样封装这个函数:
 
   
   
 
function isType(type, val{ return Object.prototype.toString.call(val) === `[object ${type}]`}
isType('String''a'// trueisType('String''b'// trueisType('String', '0') // trueisType('String'123// false
这样确实可以满足要求,但是我们进一步分析,可以看到每个函数都传入了  String 作为函数的第一个参数,那这不就是重复代码吗,是不是有一种方法,能将函数的第一个参数缓存起来,下次调用的时候就不用再传入 String 参数了。
基于原有的 isType 方法,写一个 createIsType  方法,使用这个方法来创建封装一个 isString  、 isNumber isBoolean 等方法,改写如下:
const createIsType = type => { // 将type这个变量保存在了这个代码块中,不会被销毁 return val => Object.prototype.toString.call(val) === `[object ${type}]`}const isString = createIsType('String')const isNumber = createIsType('Number')
isString('hello'// true 等同于createIsType('String')('hello')isNumber(111) // true 等同于createIsType('Number')(111)

那么这个 createIsType 函数就是一个高阶函数,因为他的返回值是一个函数 

平常我们已经用到的很多函数都高阶函数,例如sort、map、forEach、filter、some、every、reduce 和 reduceRight ,这个函数都是 JavaScript 语言已经提供给我们使用的函数,后面我会带大家手动实现这些高阶函数,可以看文后的相关文章链接

我们想一想就知道,高阶函数就是对普通函数的进一步抽象,是对业务的进一步提炼,平常工作中很多地方都可以用到高阶函数的,还有很多比如:函数的柯理化,ajax的成功的回调函数,面向切面编程等


---- END ----

 相关文章