把函数作为参数传入,这样的函数称为高阶函数,

函数式编程就是指这种高度抽象的编程范式。

也就是说:JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

eg:
**一个最简单的高阶函数:**function add(x, y, f) {return f(x) + f(y);
}
//当调用add(-5, 6, Math.abs)时,参数x,y和f分别接收-5,6和函数Math.abs,根据函数定义,可以推导计算过程为:
//x = -5;
//y = 6;
//f = Math.abs;
//f(x) + f(y) ==  Math.abs(-5) + Math.abs(6) == 11;
//return 11;//用代码验证一下:
add(-5, 6, Math.abs); // 11

我们要编写高阶函数,就是让函数的参数能够接收别的函数。

一、map/reduce 映射/简化

读了“MapReduce: Simplified Data Processing on Large Clusters”(大型集群上的简化数据处理),你就能大概明白map/reduce的概念。
  由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:
  1、map():

function pow(x) {return x * x;}var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];  // 定义一个数组arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]//map()传入的参数是pow,即函数对象本身。//不需要map(),写一个循环,也可以计算出结果:var f = function (x) {return x * x;};var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];var result = [];for (var i=0; i<arr.length; i++) {result.push(f(arr[i]));}  //这样的确可以,但是,从上面的循环代码,我们无法一眼看明白“把f(x)作用在Array的每一个元素并把结果生成一个新的Array”。所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把Array的所有数字转为字符串:var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']//只需要一行代码。

2、reduce():

再看reduce的用法。Array的reduce()把一个函数作用在这个Array的[x1, x2, x3…]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是:

     [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)//比方说对一个Array求和,就可以用reduce实现:var arr = [1, 3, 5, 7, 9];arr.reduce(function (x, y) {return x + y;}); // 25

二、filter 过滤
  filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。
  和map()类似,Array的filter()也接收一个函数。
  和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

//例如,在一个Array中,删掉偶数,只保留奇数,可以这么写:

 var arr = [1, 2, 4, 5, 6, 9, 10, 15];var r = arr.filter(function (x) {return x % 2 !== 0;});r; // [1, 5, 9, 15]//把一个Array中的空字符串删掉,可以这么写:var arr = ['A', '', 'B', null, undefined, 'C', '  '];var r = arr.filter(function (s) {return s && s.trim(); // 注意:IE9以下的版本没有trim()方法});arr; // ['A', 'B', 'C']

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
  回调函数:filter()接收的回调函数,其实可以有多个参数。
  通常我们仅使用第一个参数,表示Array的某个元素。
  回调函数还可以接收另外两个参数,表示元素的位置和数组本身:

var arr = ['A', 'B', 'C'];var r = arr.filter(function (element, index, self) {console.log(element); // 依次打印'A', 'B', 'C'console.log(index); // 依次打印0, 1, 2console.log(self); // self就是变量arrreturn true;});//利用filter,可以巧妙地去除Array的重复元素:

‘use strict’; // 严格模式

var r,arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];r = arr.filter(function (element, index, self) {return self.indexOf(element) === index;});alert(r.toString());

//去除重复元素依靠的是indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。

三、sort排序算法 先是字典排序 也就是 abcd… 1234…

因为Array的sort()方法默认把所有元素先转换为String再排序,结果’10’排在了’2’的前面,因为字符’1’比字符’2’的ASCII码小。如果不知道sort()方法的默认排序规则,直接对数字排序,绝对栽进坑里!

好在sort()方法也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。
  
//要按数字大小排序,我们可以这么写: 正序排列

 var arr = [10, 20, 1, 2];arr.sort(function (x, y) {if (x < y) {return -1;}if (x > y) {return 1;}return 0;}); // [1, 2, 10, 20]

//如果要倒序排序,我们可以把大的数放前面:

var arr = [10, 20, 1, 2];arr.sort(function (x, y) {if (x < y) {return 1;}if (x > y) {return -1;}return 0;}); // [20, 10, 2, 1]

//默认情况下,对字符串排序,是按照ASCII的大小比较的,现在,排序应该忽略大小写,按照字母序排序。
//要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:

var arr = ['Google', 'apple', 'Microsoft'];arr.sort(function (s1, s2) {x1 = s1.toUpperCase(); // 转换为大写x2 = s2.toUpperCase();if (x1 < x2) {return -1;}if (x1 > x2) {return 1;}return 0;}); // ['apple', 'Google', 'Microsoft']

//忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

//sort()方法会直接对Array进行修改,它返回的结果仍是当前Array:

 var a1 = ['B', 'A', 'C'];var a2 = a1.sort();a1; // ['A', 'B', 'C']a2; // ['A', 'B', 'C']a1 === a2; // true, a1和a2是同一对象

什么是高阶函数?举例说明相关推荐

  1. python中高阶函数和装饰器_三.Python高阶函数和装饰器

    1高阶函数 1.1 数学概念回顾下数学知识: y=f(x) 这是最开始接触的普通函数 y=g(f(x)) 这个就是我们接触到的高阶函数 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数: ...

  2. react中高阶函数与高阶组件的运用—(上)(案例详细解释高阶函数)

    前言 学习react的同学多多少少对高阶组件有所耳闻,想要学好高阶组件就必须先学好高阶函数的运行,本篇文章就先从高阶函数着手,带大家学习高阶函数和高阶组件的运用 高阶函数 高阶函数(High Orde ...

  3. Python高阶函数使用总结!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:皮钱超,厦门大学,Datawhale原创作者 本文约2000字,建 ...

  4. 列举5个python内置函数_Python5个内建高阶函数的使用

    描述 本文结合各种实际的例子详细讲解了Python5个内建高阶函数的使用,能够帮助理解Python的数据结构和提高数据处理的效率,这5个函数分别是: map reduce filter sorted/ ...

  5. python阶乘匿名函数_python的高阶函数与匿名函数

    一.高阶函数的定义 高阶函数:就是把函数当成参数传递的一种函数,例如: defadd(x,y,f):return f(x)+f(y)print(add(-8,11,abs) 结果:19 解释: 1.调 ...

  6. python中的高阶函数

    python中的高阶函数 文章目录: 1 什么是高阶函数? 1.1 高阶函数:一个函数的`函数名`作为参数传给另外一个函数 1.2 高阶函数:一个函数返回值(return)为另外一个`函数` 2 py ...

  7. python匿名函数调用_python3笔记十六:python匿名函数和高阶函数

    一:学习内容 lambda函数 map函数与reduce函数 filter函数 sorted函数 二:匿名函数-lambda 1.概念:不使用def这样的语句去定义函数,使用lambda来创建匿名函数 ...

  8. 深浅拷贝垃圾回收机制四大高阶函数

    目录: 浅拷贝和深拷贝 垃圾回收机制 高阶函数 浅拷贝和深拷贝 浅拷贝: 不管多么复杂的数据结构,浅拷贝都只会copy一层 深拷贝 : 深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的 ...

  9. python高阶函数

    高阶函数,接收函数作为参数,或者将函数作为返回值的函数是高阶函数: 5个带key内置函数 filter/map(function, iterable) --> 迭代器 sorted(iterab ...

最新文章

  1. 正则表达式 2. 单字符或
  2. IPC--进程间通信三(共享内存)
  3. linux 装nano命令,vim、nano在命令行上如何编辑文件
  4. 动态生成li 根据后台返回个数动态生成li
  5. java电池soc算法实现,BMS算法设计之电池SOC介绍(一)
  6. java messagedigest_Java MessageDigest.getInstance返回的实例非线程安全
  7. 深度linux系统能炒股吗,深度网友支招:Deepin v20下完全可以用炒股票软件
  8. 微信支付接口调用之统一下单(一)
  9. 数学中竟然还有这样的定理!
  10. Linux网络——DNS域名解析服务
  11. 软件工程 学习笔记 知识梳理
  12. ids for this class must be manually assigned before calling save()报错解决方法
  13. 一文多发神器--ArtiPubOpenWrite
  14. 十条设计原则教你学会如何设计网页布局
  15. Android 动画实现
  16. android 开启闪光灯(手电筒)
  17. 今年努力在做的两件事
  18. android友盟埋点,友盟数据埋点前,你要知道这些
  19. 【分享】中毒后360安全卫士打不开的终极解决办法
  20. 毕业设计:基于SSM框架的新生报到数据可视化系统

热门文章

  1. 自监督论文阅读笔记 Self-supervised Learning in Remote Sensing: A Review
  2. python实验报告内容实现购物车系统_Python 实践--购物车功能简单实现
  3. 100G以太网光口的FPGA测试实例
  4. R报错tar: Failed to set default locale
  5. java云片模板参数_Java使用云片API发送短信验证码
  6. 王者转号仅显示可转移的服务器,王者可以跨系统转移账号了,需要花99,大家怎么看?...
  7. JS中NaN的认识与ISNaN函数的使用
  8. ASCII码与16进制转换对照表
  9. 两数之和 IV - 输入 BST
  10. CAD常见问题处理方法