08月07, 2022

JS进阶(7)--高阶函数(1)--高阶函数介绍

高阶函数介绍

认识高阶函数

什么是高阶函数

高阶函数(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)时,参数xyf分别接收-56和函数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);

本文链接:http://www.yanhongzhi.com/post/js_ap_13.html

-- EOF --

Comments