完成了轮播图组件的实践, 接下来谈一谈高阶函数与函数式编程的思路
本篇笔记理论知识与思考讨论较多, 不喜的兄弟们可以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
干了如下事情:
- 接收一个函数参数
plus
- 返回一个函数
add
- 返回函数
add
的参数个数不定, 且会转为参数数组args
- 调用参数数组
args
的reduce
方法 reduce
方法接收第一步中提到的方法plus
高阶函数会有各式各样的骚操作, 我们最常使用的就是节流/防抖
最重要的是将函数作为参数(对象)看待的思维模式, 在编码时抛开纯粹的数据输入输出概念, 当你慢慢习惯这种思考方式后, 就会发现它会慢慢出现在你的代码中啦
6 总结
后半节课就是跟着月影大大学算法的时间, 本篇笔记内容到此为止
之前涉及的轮播图组件已经有了完整的实现, 贴一下Github链接:
最后, 非常感谢月影大大为我们带来的精彩一课, 终生受益