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 应用类库代码
Jun 02 Javascript
javascript Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
FF IE兼容性的修改小结
Sep 02 Javascript
javascript处理table表格的代码
Dec 06 Javascript
open 动态修改img的onclick事件示例代码
Nov 13 Javascript
ExtJS如何设置与获取radio控件的选取状态
Jan 22 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
jQuery实现二级下拉菜单效果
Jan 05 Javascript
Angular-Touch库用法示例
Dec 22 Javascript
浅谈vue-router 路由传参的方法
Dec 27 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
详解Vue中watch的高级用法
May 02 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
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
PHP Directory 函数的详解
2013/03/07 PHP
基于php无限分类的深入理解
2013/06/02 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
ionic2中使用自动生成器的方法
2018/03/04 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python中property属性实例解析
2018/02/10 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
师范毕业生自我鉴定
2014/01/15 职场文书
平安建设实施方案
2014/03/19 职场文书
开工仪式策划方案
2014/05/23 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS