维基百科这样描述:
高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入
输出一个函数
简言之, 一个函数可以将其他函数作为参数或者返回值是函数, 这个函数就是高阶函数.
JavaScript 中的高阶函数
map
定义: 通过指定的函数去处理数组中的每个元素, 并返回处理后的新数组.
语法:
array.map(function(currentValue,index,arr), thisValue)
实例:
- function multi(x) {
- return x * 10;
- }
- var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
- var results = arr.map(multi); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
- console.log(results);
- // 结果为: 10,20,30,40,50,60,70,80,90
- function multi(element, index, arr) {
- console.log(element, index, arr)
- return element * 10;
- }
- var arr = [10, 20, 30, 40, 50, 60, 70, 80, 90];
- var results = arr.map(multi); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
- console.log(results);
reduce
定义: 接收一个函数作为累加器, 数组中的每个值 (从左到右) 开始缩减, 最终计算为一个值.
语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
注意: 末尾的参数 initialValue 可以指定 total 初始值.
实例
- // 求和
- var arr = [1, 3, 5, 7, 9];
- var sum = arr.reduce(function (x, y) {
- return x+y
- });
- console.log(sum) // 25
- // 是指拼接
- var arr = ['1', '3', '5', '7', '9'];
- var sum = arr.reduce(function (x, y) {
- return x+y
- },5);
- console.log(sum) // 513579
- filter
定义: 创建一个新的数组, 新数组中的元素是通过检查指定数组中符合条件的所有元素.
语法:
array.filter(function(currentValue,index,arr), thisValue)
实例
- var arr = [1, 2, 4, 5, 6, 9, 10, 15];
- var newArr = arr.filter(function (x) {
- return x> 8;
- });
- console.log(newArr) //[ 9, 10, 15 ]
以上部分的高阶函数是将函数作为输入, 当然还可以将函数作为结果值返回.
- function lazy_sum(arr) {
- var sum = function () {
- return arr.reduce(function (x, y) {
- return x + y;
- });
- }
- return sum;
- }
- var f = lazy_sum([1, 2, 3, 4, 5]);
- f(); // 15
当调用 lazy_sum 函数时, 返回的是内层的 sum 函数.
在这个实例中, 引出了另外一个概念: 闭包
在一些语言中, 在函数中可以 (嵌套) 定义另一个函数时, 如果内部的函数引用了外部的函数的变量, 则可能产生闭包. 运行时, 一旦外部的 函数被执行, 一个闭包就形成了, 闭包中包含了内部函数的代码, 以及所需外部函数中的变量的引用.