高阶函数和函数柯里化

467 阅读1分钟

这几次学习加面试的过程中,问到了什么是高阶函数,我一直以为人家问的是高阶组件,然后我介绍HOC去了(其实也是我学的不精),最后人家告诉我react的map方法就是相当于一个高阶函数,我就赶紧下来学习高阶函数来了。当然,函数柯里化也是需要学习的,有些初学者连函数柯里化是什么意思都不知道,我也是刚明白的

1.高阶函数

高阶函数就是输入参数里有函数,或者输出是函数的函数。

函数作为参数

如果你用过 setTimeoutsetInterval、ajax 请求,那么你已经用过高阶函数了,这是我们最常看到的场景:回调函数,因为它将函数作为参数传递给另一个函数。

比如 ajax 请求中,我们通常使用回调函数来定义请求成功或者失败时的操作逻辑:

$.ajax("/url", function(result){
    console.log("请求成功!")
})

在基本对象的原型上有很多操作方法,可以接受回调函数来方便地进行对象操作。这里我来说一个很常用的 Array.prototype.filter() 方法,这个方法返回一个新创建的数组,包含所有回调函数执行后返回 true 或真值的数组元素。

let arr = ['a', 'aa', 'aaa', 'aaaaaaa', 'bbbbbbb', 'ccccccc'];

let result = arr.filter(function(arr) {
    return arr.length > 6
}) 
//输出: ["aaaaaaa", "bbbbbbb", "ccccccc"]

函数作为返回值

另一个经常看到的高阶函数的场景是在一个函数内部输出另一个函数,比如:

function foo() {
    return function bar() {}
}

主要是利用闭包来保持着作用域:

function fn() {
    let num = 0
    return function(a) {
        return num = num + a
    }
}
let adder = fn()

adder(1)     //1
adder(2)     //3

2.函数柯里化

柯里化(Currying),对我现在的理解来说就是部分求值,就是说一个代码把一些参数固定,然后把剩余的参数来做些调整(也不知道对不对,各位大佬随时评论打击我);

柯里化三个作用:

  1. 参数复用
  2. 提前返回
  3. 延迟计算/运行 话不多说 直接上代码
function fn3 (fn, ...rest1) {
      return function (...rest2) {
        return fn.apply(null, rest1.concat(rest2))
      }
}

function fn (name, age, fruit) {
      console.log(`我叫 ${name},我今年 ${age} 高龄, 我在 ${fruit}上学`)
}

let fn1 = fn3(fn, '狗蛋')
fn1(22, '上海')           // 输出: 我叫狗蛋,我 22 高龄, 我在上海上学

let fn2 = fn3(fn, '大锤', 20)
fn2('天津')               // 输出: 我叫大锤,我 22 高龄, 我在天津上学

以上就是我所知道的这些知识,也是我今天学到的,希望对各位有所帮助,谢谢大家。我会继续加油的