高阶函数是函数式编程的一种代码实现方案,通常把接受一个或多个函数做为参数,或者返回一个函数的函数叫作高阶函数。
js中最多见的一些高阶函数如闭包(返回函数),一些内置函数(传入函数)等。编程
例:
reduce接受两个参数,返回操做后的数据。数组
参数一(必须):函数累计器,声明要对数组的每个值执行的操做,累计器默认被传入四个参数,分别表示累计器上一次返回累计值,数组正在处理的元素,正在处理的元素下标,调用reduce的数组;其中前两个必选,后两个可选。缓存
参数二(可选):声明累计器的初始值,没有的话默认选择数组的第一个元素做为累计器的第一个值。闭包
常见错误函数式编程
当对空数组执行reduce操做时,必须指定参数二,保证累加器有一个初始值,不然会报错,如上图。函数
上图的代码执行顺序性能
例:
普通用法测试
数组包含空元素this
复杂数组spa
回调函数全部参数
map可选参数测试
map接受两个参数
参数一(必须):一个回调函数,这个函数会被自动传入三个参数分别表示数组元素,数组下标,数组自己;函数内声明对原数组的每一项作的指定操做,并将获得的数据放入一个新数组并返回;
参数二(可选):用来指定回调函数中this的指向
常见错误
将\['1','2','3'\]转换为数字数组
转换数字能够用parseInt,parseFloat,Number等方法,依次试验一下,结果以下:
这时候发现传入parseInt做为转换函数得不到想要的结果,回想一下,map接受的函数参数会被默认传入三个参数,而实际上,parseInt在使用过程当中是能够接受两个参数的,第一个是解析的字符串,而第二个可选的参数,用来表示转换的进制,尝试一下:
因此错误的缘由来自于此,当parseInt做为map的参数时,第二个参数被传入数组的下标,致使得不到想要的结果。
而parseFloat和Number则不存在这个问题。由于这两个函数都是智能接收一个字符串参数,而且返回转换后的结果。
示例:
filter接受两个参数
参数一(必选) 回调函数,指定过滤条件,回调函数接收三个参数,如上图所示,分别为当前处理的数组元素,当前处理的数组下标,调用filter的数组自己,而且返回一个过滤条件,符合条件的数组元素会被放入新数组返回;
参数二(可选) 同map,用来指定回调函数中this的指向;
经过高阶函数,咱们还能够实现一些诸如函数缓存,函数柯里化等来提升js代码的性能及可读性,这个下次在说