高阶函数

高阶函数

高阶函数是什么,定义函数的三种方式

2018-08-28侠课岛    中级进阶       

前端/前端/ES6函数式编程 15     0     1803

高阶函数(higher-order function)指的就是能操作另一个函数的函数,一般来说,这种操作有两种情况

  • 把另一个函数作为输入参数进行传递
  • 把另一个函数作为输出返回值

在语法并不十分严谨的javascript中,对函数进行这样的操作是允许的,并且应用场景也十分的多。

在javascript中,一般有三种定义函数的方式。

//方式1: 使用function关键字显式定义
function fun1(){
  ...
  return 'fun1'
}
//方式2: 使用函数表达式定义
const _fun2 = function() {
  ...
  return '_fun2'
}
const fun2 = () => {
  ...
  return 'fun2'
}

//方式3: 使用Function()构造函数定义
const fun3 = new Function('x', 'return x+1')

javascript 中变量是弱类型,既然可以使用变量来声明函数,那这类变量也是可以用于作为函数的参数,那就可以实现函数作为参数传入另一个函数。 继续上面的代码段,方式2和方式3的代码已经是通过表达式的方式定义,所以,变量名就是指向具体函数代码的内存首地址,所以对变量的操作,就是对函数的操作。 既然定义函数相当于定义变量,那么函数名(变量名)就可以像变量一样进行赋值和传值,同时也可以像参数一样进行传递。

// 对函数名进行传值
const myFun1 = fun1   
myFun1()  // fun1

const _myFun1 = fun1()  // fun1

function myFun2 = function(f) {
  return `This is ${f()}`
}
myFun2(myFun1)   // This is fun1

函数接收的输入参数是变量,变量可以指向函数,那么一个函数就可以接收另一个函数作为参数,这种形式的函数称为高阶函数。

平时编程时也常会用到原生 javascript 中提供的内置高阶函数。

const arr = ['apple', 'pear', 'peach', 'grape', 'watermelon', 'lemon', 'mango', 'banana']

const sortByInitials = (a, b) => {
  return a.slice().toLocaleLowerCase() > b.slice().toLocaleLowerCase()
}

console.log(arr.sort(sortByInitials))  // ["apple", "banana", "grape", "lemon", "mango", "peach", "pear", "watermelon"]

根据首字母对数组进行排序这是个典型的例子,要实现排序一般两种方式,一种是使用原生提供的 sort 方法,另一种就是自己写的排序方式,比如冒泡排序、快速排序之类的;这里的代码重写的 sort 默认的方式,通过传递函数作为参数来实现自定义排序。

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

15

本课评分:
  •     非常好
难易程度:
  •     适中的
|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?