高阶函数介绍
认识高阶函数
什么是高阶函数
高阶函数(higher-order-function)并不是 JavaScript 语言所特有的东西,它适用于整个计算机领域,甚至数学领域。
它的定义非常简单。
根据维基百科的定义,无论是在数学领域,还是在计算机领域,凡是满足以下任一条件的函数,均是高阶函数:
接受一个或多个函数作为输入
输出一个函数
在大部分计算机语言中,一个函数的输入往往被看作是函数的参数,而一个函数的输出,往往被看作是函数的返回值,因此,上面作为高阶函数条件的两个点,放到计算机领域,可以说成是:
(1)接受一个或多个函数作为参数 (2)返回一个函数 怎么样?从定义上看,高阶函数是不是很简单呢?接下来,我们看看在 JavaScript 语言中,如何实现高阶函数。
在 JavaScript 中实现高阶函数
函数是一等公民
在 JavaScript 语言中,函数被视为一等公民。
何为一等公民?就是函数可以像其他数据类型(数字、字符串、布尔等)一样,有权力出入任何场所,这一点在很多其他语言(比如 Java、C# 等)中是不太容易做到的。
在 JavaScript 语言中,函数可以保存到变量、作为参数传递、作为返回值返回。
高阶函数,其实最开始是数学中的概念演变而来
一个最简单的高阶函数:
function add(x, y, f) {
return f(x) + f(y);
}
当我们调用add(-5, 6, Math.abs)
时,参数x
,y
和f
分别接收-5
,6
和函数Math.abs
,根据函数定义,我们可以推导计算过程为:
x = -5;
y = 6;
f = Math.abs;
f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11;
return 11;
用代码验证一下:
function add(x, y, f) {
return f(x) + f(y);
}
var x = add(-5, 6, Math.abs); // 11
console.log(x);
我们之前一直使用的数组中的很多方法,其实都是高阶函数,比如forEach,filter,map等等,我们甚至可以简单的仿写一下,比如:
仿写 数组.forEach()函数
const array = [1, 2, 7, 4, 5]
function forEach (array, fn) {
for (let index = 0; index < array.length; index++) {
fn(array[index])
}
}
forEach(array, function (item) {
console.log(item)
}) // 1 2 7 4 5
仿写 数组.filter()函数
const array = [1, 2, 7, 4, 5]
function filter(array,fn){
let arr = [];
for(let i=0; i<array.length; i++){
if(fn(array[i])){
arr.push(array[i]);
}
}
return arr;
}
let a = filter(array,function(item){
if(item % 2 === 0){
return true;
}
})
console.log(a);
Comments