JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析


Posted in Javascript onMay 22, 2019

本文实例讲述了JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法。分享给大家供大家参考,具体如下:

高阶函数(higher-order functions),就是返回其它函数的函数,或者使用其它函数作为它的参数的函数。

使用函数作为参数

因为函数本身就是一个值,所以可以让函数作为参数传递给其它的函数。JavaScript 有些函数就需要用到函数类型的参数,比如 Array.map。

比如我有一组数据:

const names = ['小猫', '小狗', '小刺猬']

我要分别问候一下这组数据里的每个项目:

const greetings = names.map(function(name) {
 return `hi ~ ${name}`
})
console.log(greetings)
// ["hi ~ 小猫", "hi ~ 小狗", "hi ~ 小刺猬"]

上面的 map 方法里用了一个匿名函数作为它的参数。在这个函数里面,我们在数组里的每个项目的前面都加上了一个 “hi ~” ,map 会返回一个新的数组,这个数组我交给了 greetings 变量。

用箭头函数会更简洁一些:

const greetings = names.map(name => `hi ~ ${name}`)

高阶函数

高阶函数(higher-order functions)。在 JavaScript 里面,函数跟普通的对象没啥大区别,所以你可以让函数作为参数传递到其它的函数里面,你也可以在函数里返回函数。使用函数作为参数的函数,或者返回函数的函数,这些函数被称为高阶函数(higher-order functions)。

比如刚才我们用的 map 就是一个高阶函数,因为它会用到一个函数作为它的参数。

再看一个例子:

const robot = (name, action) => {
 return action(name)
}
const greet = (name) => {
 return `hello, ${name}`
}
const greeting = robot(' 您好 ', greet)
// 返回 “ hello, 您好 ”

robot 是个函数,它支持两个参数,name 与 action,这里的 action 参数的类型是一个函数。在 robot 里面返回了 action ,并且把 name 参数的值交给了 action。接下面我们又定义了一个函数叫 greet,它接受一个参数是 name ,这个函数会返回一个字符串。

然后我们用了一下 robot 这个函数,设置了一下它的两个参数的值,name 参数的值是 ' 您好 ‘,action 参数的值是我们定义的 greet 这个函数。执行的结果就会是:

hello, 您好

我们可以再去定义一下函数:

const goodbye = (name) => {
 return `bye, ${name}`
}

然后再用一下 robot 函数:

const byeBye = robot(' 您好 ', goodbye)

这次会返回:

bye, 您好

完整的例子:

const robot = (name, action) => {
 return action(name)
}
const greet = (name) => {
 return `hello, ${name}`
}
const greeting = robot(' 您好 ', greet)
console.log(greeting)
const goodbye = (name) => {
 return `bye, ${name}`
}
const byeBye = robot(' 您好 ', goodbye)
console.log(byeBye)

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 循环读取JSON数据的代码
Jul 17 Javascript
JQuery通过Ajax提交表单并返回结果
Jul 31 Javascript
jQuery实现的图文高亮滚动切换特效实例
Aug 10 Javascript
JavaScript实现数据类型的相互转换
Mar 06 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
jsp 自动编译机制详细介绍
Dec 01 Javascript
Angular JS 生成动态二维码的方法
Feb 23 Javascript
vue实现表格数据的增删改查
Jul 10 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
小程序自定义日历效果
Dec 29 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
vue实现Input输入框模糊查询方法
Jan 29 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 #Javascript
详解在React-Native中持久化redux数据
May 22 #Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 #Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 #Javascript
jQuery Migrate 插件用法实例详解
May 22 #jQuery
自定义Vue组件打包、发布到npm及使用教程
May 22 #Javascript
Vue中的组件及路由使用实例代码详解
May 22 #Javascript
You might like
分享PHP入门的学习方法
2007/01/02 PHP
php上传文件的增强函数
2010/07/21 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Python 防止死锁的方法
2020/07/29 Python
python利用线程实现多任务
2020/09/18 Python
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
七一建党节慰问信
2015/02/14 职场文书
教师调动申请报告
2015/05/18 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
golang正则之命名分组方式
2021/04/25 Golang
Redis 哨兵机制及配置实现
2022/03/25 Redis
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫