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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
jQuery ui 1.7更新小结
Aug 15 Javascript
js改变img标签的src属性在IE下没反应的解决方法
Jul 23 Javascript
javascript中解析四则运算表达式的算法和示例
Aug 11 Javascript
IE中鼠标经过option触发mouseout的解决方法
Jan 29 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
JavaScript中for循环的几种写法与效率总结
Feb 03 Javascript
AngularJS基于factory创建自定义服务的方法详解
May 25 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 Javascript
今天,小程序正式支持 SVG
Apr 20 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 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中邮箱地址正则表达式实现与详解
2012/04/24 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
在JS循环中使用async/await的方法
2018/10/12 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
Python 元组(Tuple)操作详解
2014/03/11 Python
Python SQLite3数据库操作类分享
2014/06/10 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python中lambda()的用法
2017/11/16 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python处理RSTP视频流过程解析
2020/01/11 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
垃圾桶标语
2014/06/24 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
爱护公物主题班会
2015/08/17 职场文书