什么是高阶函数(higher-order function)

函数名是指向函数的一个引用变量。
当一个函数接收的参数是函数名时,这个函数就称为高阶函数。

  1. map
    map()方法定义在JavaScript的Array中,我们调用Array的map()方法,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。eg:
'use strict';

function pow(x) {
    return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow,; // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);

2.reduce
Array的reduce()把一个函数作用在这个Array的[x1, x2, x3…]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
比方说对一个Array求和,就可以用reduce实现:

var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
    return x + y;
}); // 25

3.filter
filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
例如,在一个Array中,删掉偶数,只保留奇数,可以这么写:

var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
    return x % 2 !== 0;
});
r; // [1, 5, 9, 15]

filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身:

var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) {
    console.log(element); // 依次打印'A', 'B', 'C'
    console.log(index); // 依次打印0, 1, 2
    console.log(self); // self就是变量arr
    return true;
});

4.sort
Array的sort()方法默认把所有元素先转换为String再排序,字符串根据ASCII码进行排序。
sort()方法也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。比较的过程必须通过函数抽象,不用关心具体的比较次序,不用关心用的是什么排序算法。
通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1.
这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。
要按数字大小排序,我们可以这么写:

'use strict';
var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
});
console.log(arr); // [1, 2, 10, 20]

https://www.liaoxuefeng.com