3

高阶函数

高阶函数是函数式编程的一种代码实现方案,一般把接受一个或多个函数作为参数,或者返回一个函数的函数叫做高阶函数。

js中最常见的一些高阶函数如闭包(返回函数),一些内置函数(传入函数)等。

Array.prototype.reduce

例:
image.png
reduce接受两个参数,返回操作后的数据。

参数一(必须):函数累计器,声明要对数组的每一个值执行的操作,累计器默认被传入四个参数,分别表示累计器上一次返回累计值,数组正在处理的元素,正在处理的元素下标,调用reduce的数组;其中前两个必选,后两个可选。

参数二(可选):声明累计器的初始值,没有的话默认选择数组的第一个元素作为累计器的第一个值。

常见错误

image.png

当对空数组执行reduce操作时,必须指定参数二,保证累计器有一个初始值,否则会报错,如上图。

image.png

上图的代码执行顺序

  1. 将数组的第一个元素 1 作为累计器的初始值;
  2. 第一次循环,从数组的第二个元素开始,初始值1,当前值2,下标1;
  3. 第二次循环,初始值为之前的累计值 3,当前值3,下标2;
  4. 得到最终累计值为6,返回结果,计算结束下标1;
Array.prototype.map

例:
普通用法

image.png

数组包含空元素

image.png

复杂数组

image.png

回调函数所有参数

image.png

map可选参数测试

image.png
image.png

map接受两个参数

参数一(必须):一个回调函数,这个函数会被自动传入三个参数分别表示数组元素,数组下标,数组本身;函数内声明对原数组的每一项做的指定操作,并将得到的数据放入一个新数组并返回;

参数二(可选):用来指定回调函数中this的指向

常见错误

将['1','2','3']转换为数字数组

转换数字可以用parseInt,parseFloat,Number等方法,依次试验一下,结果如下:

image.png

这时候发现传入parseInt作为转换函数得不到想要的结果,回想一下,map接受的函数参数会被默认传入三个参数,而实际上,parseInt在使用过程中是可以接受两个参数的,第一个是解析的字符串,而第二个可选的参数,用来表示转换的进制,尝试一下:

image.png

所以错误的原因来自于此,当parseInt作为map的参数时,第二个参数被传入数组的下标,导致得不到想要的结果。
而parseFloat和Number则不存在这个问题。因为这两个函数都是智能接收一个字符串参数,并且返回转换后的结果。

Array.prototype.filter

示例:
image.png

filter接受两个参数
参数一(必选) 回调函数,指定过滤条件,回调函数接收三个参数,如上图所示,分别为当前处理的数组元素,当前处理的数组下标,调用filter的数组本身,并且返回一个过滤条件,符合条件的数组元素会被放入新数组返回;
参数二(可选) 同map,用来指定回调函数中this的指向;

通过高阶函数,我们还可以实现一些诸如函数缓存,函数柯里化等来提高js代码的性能及可读性,这个下次在说


张磊
15 声望1 粉丝