什么是高阶函数?
首先,高阶函数的确切含义是:比典型函数更高的抽象级别。它是对其他函数执行操作的函数。在此定义中,操作可能意味着将一个或多个函数作为参数,或者将一个函数作为结果返回。 你不必同时做这两个事情。进行一项或多项操作即可将功能视为高阶功能。
示例
如果没有高阶函数,要在数组中的每个数字上加1 并在控制台中显示它,则可以执行以下操作:
代码语言:javascript复制const numbers = [1, 2, 3, 4, 5];
function addOne(array) {
for (let i = 0; i < array.length; i ) {
console.log(array[i] 1);
}
}
addOne(numbers);
上面代码中函数 addOne()接受一个数组,将1和数组中的每个数字相加,并将其显示在控制台中。原始值在数组中保持不变,但是该函数正在为数组中的每个值做一些事情。
但是,使用最常见的高阶函数forEach(),我们可以简化此过程:
代码语言:javascript复制const numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) => console.log(number 1));
哇!
我们已经将上面原始代码中的函数定义和调用抽象为一行!
我们将forEach()应用于名为“numbers”的数组。forEach()开头有一个匿名函数,它一次接受数组中的一个元素。对于名为numbers的数组,将数组中的每个元素命名为“number”是有意义的,尽管我们可以将其命名为“element”或“el”,甚至是“whatever”。
接着,匿名箭头函数将数字 1的值输出到控制台。
同样地,高阶函数forEach()将函数应用于数组的每个元素。
另一个高阶函数示例
如果没有更高阶函数,如果我想创建一个新的数组,只有奇数的数字数组,我可以做以下工作:
代码语言:javascript复制const numbers = [1, 2, 3, 4, 5];
function isOdd(array, oddArr = []) {
for (let i = 0; i < array.length; i ) {
if (array[i] % 2 !== 0) {
oddArr.push(array[i]);
}
}
return oddArr;
}
const oddArray = isOdd(numbers);
console.log(oddArray);
上面代码中,函数isOdd()接受一个数组,并有第二个可选的数组形参。如果未提供,则该数组的默认值为空数组。
该函数检查数组中的每个数字,看它是否是奇数。如果数字是奇数,则将其从第二个形参添加到数组中。检查完所有数字后,返回第二个参数的数组。
如果使用高阶函数 filter(),可以这么写:
代码语言:javascript复制const numbers = [1, 2, 3, 4, 5];
const oddArray = numbers.filter((number) => number % 2 !== 0);
console.log(oddArray);