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输入邮箱自动提示实例代码
Jan 13 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
Jun 20 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
Feb 13 Javascript
JS烟花背景效果实现方法
Mar 03 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
Apr 10 Javascript
React组件生命周期详解
Jul 03 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
vue中使用refs定位dom出现undefined的解决方法
Dec 21 Javascript
AngularJS实现的锚点楼层跳转功能示例
Jan 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
牡丹941资料
2021/03/01 无线电
文件上传的实现
2006/10/09 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
PHP查询网站的PR值
2013/10/30 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
jQuery事件对象总结
2016/10/17 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
JS实现旋转木马轮播图
2020/01/01 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
javascript中闭包closure的深入讲解
2021/03/03 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
什么是serialVersionUID
2016/03/04 面试题
公司委托书范本
2014/04/04 职场文书
常务副总经理任命书
2014/06/05 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
护士求职自荐信范文
2015/03/04 职场文书
经营目标责任书
2015/05/08 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android
python中pycryto实现数据加密
2022/04/29 Python