【青训营】- 跟着月影学JavaScript学习笔记(五) 高阶函数

完成了轮播图组件的实践, 接下来谈一谈高阶函数与函数式编程的思路

本篇笔记理论知识与思考讨论较多, 不喜的兄弟们可以ctrl+w关闭

4 函数式编程

其实很多兄弟们在工作中应该或多或少都使用过高阶函数, 或者说使用过函数式编程思维

函数式编程是指可以把函数当作一个整体/一种类型, 它可以作为参数, 亦可以作为返回值, 使用方式类似于Java8中的函数参数, 概念类似于Python中的万物皆对象(函数)

当然, JavaScript就是JavaScript, 它的函数式编程思想在自己的语言中有最好的应用

笔者认为, 在工作中最快理解并实践函数式编程, 是将它看作一个对象(它本身在JavaScript中也就是个对象)

平时怎么使用对象, 现在就可以怎么使用这个函数对象

5 高阶函数

首先贴一下月影老师的高阶函数等价范式:

function HOF0(fn) {
  return function(...args) {
    return fn.apply(this, args);
  }
}
复制代码

想要快速理解并掌握高阶函数的编写是较为困难的(理解成Python中的函数装饰器会简单点?)

笔者在这里和兄弟们一起分析下老师给的示例

连加示例:

function reducible(fn) {
  return function(...args) {
    return args.reduce(fn);
  }
}

const add = reducible((x, y) => x + y);
add(1, 2, 3, 4); // 10
复制代码

乍一看有些绕, 我们先写的更清楚一些:

// reducible代码...
const plus = function(x, y) {
  return x + y
}
const add = reducible(plus);
复制代码

是不是明朗些了?现在reducible这个高阶函数, 接受了函数plus作为参数

接下来进入reducible的内部:

function reducible(fn) {
  return function(...args) {
    return args.reduce(fn);
  }
}
复制代码

其实这里的重点是reduce, 它是JavaScript中数组的内置方法, 可以参考MDN文档

MDN文档中的示例, 和月影大大的有异曲同工(一模一样)的特点:

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// expected output: 15
复制代码

到这里不难理解, 其实高阶函数reducible干了如下事情:

  1. 接收一个函数参数plus
  2. 返回一个函数add
  3. 返回函数add的参数个数不定, 且会转为参数数组args
  4. 调用参数数组argsreduce方法
  5. reduce方法接收第一步中提到的方法plus

高阶函数会有各式各样的骚操作, 我们最常使用的就是节流/防抖

最重要的是将函数作为参数(对象)看待的思维模式, 在编码时抛开纯粹的数据输入输出概念, 当你慢慢习惯这种思考方式后, 就会发现它会慢慢出现在你的代码中啦

6 总结

后半节课就是跟着月影大大学算法的时间, 本篇笔记内容到此为止

之前涉及的轮播图组件已经有了完整的实现, 贴一下Github链接:

最后, 非常感谢月影大大为我们带来的精彩一课, 终生受益

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享