原文:https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/

译者:jingruzhang

校对者:acusp

高阶函数

高阶函数可以接收函数作为参数,同时也可以返回一个新的函数。

高阶函数之所以高阶,是因为高阶函数的参数和返回值对象可以是函数,这超越了普通函数处理的数据类型,例如字符串(strings)、数字(numbers)、布尔值(booleans)等。

JavaScript 中,函数的应用场景很丰富:

  • 作为变量存储

  • 在数组中使用

  • 作为对象属性(即方法)

  • 作为参数传递

  • 作为其他函数的返回值

理解高阶函数的关键在于,函数即数据

数据是函数运作的基本

数据:字符串(Strings)

sayHi = (name) => `Hi, ${name}!`;result = sayHi('User');

console.log(result); // 'Hi, User!'

数据:数字(Numbers)

double = (x) => x * 2;result = double(4);

console.log(result); // 8

数据:布尔值(Booleans)

getClearance = (allowed) => allowed ?  'Access granted' :  'Access denied';

result1 = getClearance(true);result2 = getClearance(false);

console.log(result1); // 'Access granted'console.log(result2); // 'Access denied'

数据:对象(Objects)

getFirstName = (obj) => obj.firstName;

result = getFirstName({      firstName: 'Yazeed'});

console.log(result); // 'Yazeed'

数据:数组(Arrays)

len = (array) => array.length;result = len([1, 2, 3]);

console.log(result); // 3

在所有的主流语言中,以上这五种数据类型被称为 “头等对象”(原文:first-class citizen, https://www.wikiwand.com/en/First-class_citizen)。

为什么是“头等”呢?因为这五种数据类型既可以作为参数传递,又可以存储在变量或者数组中,还可以作为变量用于计算,是数据的基本形式。

函数也是数据

函数作为参数

isEven = (num) => num % 2 === 0;result = [1, 2, 3, 4].filter(isEven);

console.log(result); // [2, 4]

请观察 filter 函数是如何使用 isEven 函数来判断要保留哪些内容的。这里的 isEven 是一个函数,作为参数传入了 filter 函数中。

filter 函数每次在做判断的时候都会调用 isEven 函数,用 isEven 函数返回的布尔值来决定当前数值的去留。

函数作为返回值

add = (x) => (y) => x + y;

add 函数需要两个参数,但不需要它们俩同时传入,第一次传参传入 x 就会返还一个新函数,这个函数需要传入 y 参数。

能够这样操作的基础在于 JavaScript 语言允许函数本身作为返回值存在,就像函数可以返回字符串(strings)、数字(numbers)、布尔值(booleans)等,JS 函数还可以返回另一个函数。

当然,我们也可以使用“双重调用”的方式,一次性提供 xy 两个参数:

result = add(10)(20);

console.log(result); // 30

或者分两次调用,先传参数 x,再传参数 y

add10 = add(10);result = add10(20);

console.log(result); // 30

在上面这个例子中, add10 函数是第一次调用 add 函数的返回值,可以尝试用 console.log 把结果打出来观察一下。

add10 函数会接收 y 参数,然后返回 x + y 值。一旦 y 值到位,函数会立马进行运算并返回结果。

可重复利用性

高阶函数的魅力在于它的可重复利用性,如果不是高阶函数,mapfilterreduce 等强大的数组函数就不可能存在。

假设我们有一组用户,如下所示,然后我们要对该数组进行操作。

users = [  {    name: 'Yazeed',    age: 25  },  {    name: 'Sam',    age: 30  },  {    name: 'Bill',    age: 20  }];

Map

没有高阶函数的话,我们必须回到 for 循环的怀抱才能实现 map 函数的操作。

getName = (user) => user.name;usernames = [];

for (let i = 0; i   const name = getName(users[i]);

  usernames.push(name);}

console.log(usernames);// ["Yazeed", "Sam", "Bill"]

map 函数就简单多啦!

usernames = users.map(getName);

console.log(usernames);// ["Yazeed", "Sam", "Bill"]

Filter

在没有高阶函数的情况下,必须要用 for 循环来实现 filter 函数的功能。

startsWithB = (string) => string.toLowerCase().startsWith('b');

namesStartingWithB = [];

for (let i = 0; i   if (startsWithB(users[i].name)) {    namesStartingWithB.push(users[i]);  }}

console.log(namesStartingWithB);// [{ "name": "Bill", "age": 20 }]

filter 函数就简单多啦!

namesStartingWithB = users.filter((user) => startsWithB(user.name));

console.log(namesStartingWithB);// [{ "name": "Bill", "age": 20 }]

Reduce

reduce 函数也是的……没有高阶函数的话,很多高端操作都是无法实现的!

total = 0;

for (let i = 0; i   total += users[i].age;}

console.log(total);// 75

那这样是不是简单多啦?

totalAge = users.reduce((total, user) => user.age + total, 0);

console.log(totalAge);// 75

总结

  • 字符串(strings)、数字(numbers)、布尔值(booleans)、数组(arrays)、对象(objects)可以作为变量(variables)、数组(arrays)、属性( properties)或者方法(methods)存储起来。

  • JavaScript 语言中,函数也是像数据一样同等对待的。

  • 因此函数可以作为另外一个函数的参数或者返回值使用,这样的做法叫高阶函数

  • mapfilterreduce 等函数就是高阶函数的最佳代表,它们让数组的处理(改变,搜索,相加等)变得简单不少!

函数传参string_JavaScript 高阶函数入门浅析相关推荐

  1. python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)

    文章目录 高阶函数 函数传参 返回函数(闭包) 匿名函数lambda 高阶函数 定义: 至少满足下列一个条件: 接受一个或多个函数作为输入 输出一个函数 python里的高阶函数有 filter.ma ...

  2. export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...

    高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...

  3. 1.函数的结构,调用,传参,形参,实参,args,kwargs,名称空间,高阶函数

    1.函数的初识 初始函数 获取任意一个字符串的元素的个数 s1='dsjdkjkfefenga' count=0 for i in s1:count+=1 print(count) 获取列表的元素的个 ...

  4. Scala入门到精通——第十三节 高阶函数

    本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 部分应用函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返 ...

  5. Scala入门到精通——第五节 函数、高阶函数与闭包

    本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)闭包 函数字面量(值函数) 函数字面量(function literal),也称值函数(functio ...

  6. python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...

    高阶函数 在Python中,函数其实也是一种数据类型. def test(): return 'hello world' print(type(test)) # 函数对应的数据类型是 function ...

  7. python偏函数和高阶函数_【Python入门】8.高阶函数之 匿名函数和偏函数

    目录 高阶函数 匿名函数 lambda 偏函数 高阶函数 匿名函数 lambda lambda,即希腊字母λ.顾名思义,匿名函数没有函数名,在运用时采取lambda x : ...的方式,如lambd ...

  8. JavaScript高阶函数快速入门

    高阶函数 (Higher-Order Functions) A function that accepts and/or returns another function is called a hi ...

  9. scala入门之高阶函数案例

    基于Java学习scala 高阶函数练习案例 1.定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作 2.定义一个高阶函数,按照指定的规则对集合中的所有元素进行聚合 3.定义一个高阶函数,按 ...

最新文章

  1. 干货丨一文看懂人工智能、机器学习和深度学习的区别与联系
  2. 在Docker中的ubuntu中安装Python3和Pip
  3. 【深度学习】深度学习语义分割理论与实战指南.pdf
  4. 给未来的自己一封信计算机,给未来的自己一封信
  5. nginx学习九 upstream 负载均衡
  6. oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)
  7. 智能硬件的时代,嵌入式是否已经日薄西山
  8. 电商管理系统源码_Dubbo/SSM/Elasticsearch/Redis/MySQL搭建分布式电商购物商城
  9. web面试 new操作符到底干了什么?
  10. 利用系统级别的光谱成像技术分析细胞器的互作组学
  11. 基于51单片机ADC0808自动数字电压表仿真数码管显示
  12. 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有纯滞后一阶惯性系统计算机控制系统设计.pdf...
  13. 排序算法---堆排序
  14. android 多开app store,苹果手机如何做到微信双开?
  15. Android项目开发教程之OpenGL ES
  16. 高斯模糊的算法(高斯权重)
  17. 信息编码--区位码,国标码,内码
  18. E2E测试---Cypress 使用
  19. 输出英文字母的后继字母 c语言,Java 【打印俄文的英文字母】
  20. vue 数组中嵌套数组_vue数组嵌套数组的问题

热门文章

  1. 《零基础看得懂的C++入门教程 》——(3)表达式花样挺多鸭
  2. 江苏信息考试access_软考 信息处理技术员备考复习攻略
  3. 史上最“可怕”的数学科普,能全都看懂的只有天才!
  4. 理工男都能有多痴情?
  5. 老师“鬼话”全曝光!哈哈哈哈哈全国的老师都这样吗?
  6. 一定要多角度看事物 | 今日最佳
  7. 通过简单的Word Count讲解MapReduce原理以及Java实现
  8. 2021年度最全面JVM虚拟机,类加载过程与类加载器
  9. 10kv电压互感器型号_电压互感器型号大全
  10. icd11中文版精神障碍pdf_精神与行为障碍类别目录(ICD-11)