js 高阶函数
参考:https://blog.csdn.net/high32/article/details/114000979
1. 函数式编程
函数式编程不是用函数来编程,也不是传统的面向过程编程。主旨在于将复杂的函数复合成简单的函数(计算理论,或者递归论,或者拉姆达演算)。运算过程尽量写成一系列嵌套的函数调用。
1.1 函数是“一等公民”
在 javascript 里,函数被提升到“一等公民”的地位。函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
一等公民:在编程语言中,一等公民可以作为函数参数,可以作为函数返回值,也可以赋值给变量。
1.2 纯函数
函数式编程里强调,只有纯的、没有副作用的函数,才是合格的函数。
对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态的函数,叫做纯函数。
var arr = [1,2,3,4,5]; arr.slice(0,3); //arr还是[1,2,3,4,5]; slice是纯函数,因为它没有副作用,对于固定的输入,输出总是固定的 arr.splice(0,3) //arr是[4,5]; splice会对原函数造成影响,所以它不是纯函数
2. 高阶函数
2.1 概念
JavaScript 的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
- 接收函数作为参数(参数是函数)
- 返回函数作为输出(返回值是函数)
数组中的map/filter/reduce/sort
方法是 js 的原生高阶函数,也是我们常用函数。
2.2 map
map 一般用于操作数组集合,遍历操作用。
返回值:由原数组每个元素执行回调函数的结果组成的新数组。
arr.map((value,index,array)=>{},thisArg)
const arr = [1, 2, 3]; const newArr = arr.map(item => item * 2); console.log(newArr); //[2, 4, 6]
2.3 filter
filter 一般用于筛选元素用。
返回值:一个新的、由通过测试的元素组成的数组。
arr.filter((value,index,array)=>{},thisArg)
const arr = [1, 1, 2, 2, 3, 4, 3, 4, 5, 5, 4]; const newArr = arr.filter((ele, index, self) => { return self.indexOf(ele) === index; }); console.log(newArr); // [1, 2, 3, 4, 5]
2.4 reduce
reduce 一般用于数组元素计算。
返回值:函数累计处理的单个返回值。
arr.reduce((total,value,index,array)=>{},initValue)
const arr = [1, 2, 3]; let sum = arr.reduce((accumulator, currentValue, currentIndex, array) => { return accumulator + currentValue; }); console.log(sum); // 10
2.5 sort
sort 排序。
返回值:排序后的数组。
arr.sort((a,b)=>{})
const arr = [1, 20, 10, 5]; let compareNumbers= function (a, b) { return a - b; } const newArr = arr.sort(compareNumbers); console.log(newArr); // [1, 5, 10, 20]
3. 函数柯里化
通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码方式。
// 普通的 add 函数 function add(x, y) { return x + y; } // Currying后 function curryingAdd(x) { return function (y) { return x + y; } } add(1, 2); // 3 curryingAdd(1)(2); // 3