JavaScript函数式编程(Functional Programming)纯函数用法分析


Posted in Javascript onMay 22, 2019

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

函数式编程鼓励我们多创建纯函数(pure functions),纯函数只依赖你交给它的东西,不使用任何函数以外的东西,也不会影响到函数以外的东西。跟纯函数对应的就是不纯函数(impure functions),也就是不纯函数可能会使用函数以外的东西,比如使用了一个全局变量。也可能会影响到函数以外的东西,比如改变了一个全局变量的值。

多使用纯属函数是因为它更可靠一些,也没什么副作用(side effects)。你交给它同样的值,它每次都会给你输出同样的结果,这种特质叫所指透明(Referential transparency) 。这会让程序更稳定,也更容易测试。

副作用

纯函数没副作用,有副作用的函数都不纯。我吃了一片感冒药,是要治我的感冒,但副作用是它让我想睡觉。函数的副作用多数表现为函数依赖或者改变了它以外的东西。

看个例子:

let name = 'longzhoufeng'
const greet = () => {
 console.log(`hello, ${name}`)
}

greet 不是纯函数,因为这个函数依赖函数以外的东西,这里就是全局作用域下的 name。这样做的问题是,函数依赖的 name 很可能在应用运行的时候发生变化,这样试一下:

greet() // 输出:“hello, longzhoufeng”
let name = 'longzhoupeng' // name 的值被改变了
greet() // 输出:“hello, longzhoupeng”

这样改一下:

const greet = (name) => {
 console.log(`hello, ${name}`)
}

现在函数明确的说明了自己需要的东西,这里就是 name 参数。它现在只依赖你交给它的 name 参数的值。但是这个函数仍然不是纯函数,因为它在控制台上输出了东西,这其实改变了函数之外的东西,所以它不是纯函数。这样再改一下:

const greet = (name) => {
 return `hello, ${name}`
}

现在 greet 就会是一个纯函数,因为它只依赖交给它的 name ,也没有改变函数以外的东西。而且你每次给它同样的 name 值,它每次都会给我们返回同样的结果。这种函数用起来即安全又可靠。

所指透明

所指透明(Referential transparency)。比如我说:“中国的首都”。我的表达所指的意思就是 “北京”,没什么其它的隐含的意思。所以可以说我的表达所指是透明的(Referentially transparent)。再比如:“我有点饿”。这个表达所指就不透明,我表达的到底是什么意思是不能确定的,我可能是想出去吃点东西,也可能是想让你帮我买点东西回来吃。

纯函数所指的东西都是透明的,因为你给它同样的东西,它每次都会返回一样的结果。

const greet = (name) => {
 return `hello, ${name}`
}
const logger = (message) => {
 console.log(message)
}
logger(greet('longzhoufeng'))
// 上面的表达式也可以这样:
logger('hello, longzhoufeng')
// 得到的结果是一样的,因为 greet 所指透明。
// 给它一个 “longzhoufeng”,它所指的东西就是 “hello, longzhoufeng”

因为 greet 所指透明,所以如果我们在表达式中把它替换成它所指的东西,不会影响到程序的运行。比如在一个表达式里所有使用 greet('longzhoufeng') 的地方,我们都可以把 greet('longzhoufeng') 替换成 hello, longzhoufeng,这是因为 greet('longzhoufeng') 所指的东西就是字符串 hello, longzhoufeng 。

参考资料

http://stackoverflow.com/questions/210835/what-is-referential-transparency

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

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

Javascript 相关文章推荐
web 页面分页打印的实现
Jun 22 Javascript
javascript Base类 包含基本的方法
Jul 22 Javascript
Dom操作之兼容技巧分享
Sep 20 Javascript
JavaScript解析json格式数据简单示例
Dec 09 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
Dec 14 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
javascript实现Java中的Map对象功能的实例详解
Aug 21 Javascript
js禁止表单重复提交
Aug 29 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
jQuery Migrate 插件用法实例详解
May 22 #jQuery
自定义Vue组件打包、发布到npm及使用教程
May 22 #Javascript
Vue中的组件及路由使用实例代码详解
May 22 #Javascript
Vue侦测相关api的实现方法
May 22 #Javascript
一文快速详解前端框架 Vue 最强大的功能
May 21 #Javascript
微信小程序系列之自定义顶部导航功能
May 21 #Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
May 21 #Javascript
You might like
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
一些常用的Javascript函数
2006/12/22 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
python 算法 排序实现快速排序
2012/06/05 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
Python中import机制详解
2017/11/14 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Django工程的分层结构详解
2019/07/18 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
分享一个python的aes加密代码
2020/12/22 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
参观监狱心得体会
2014/01/02 职场文书
追悼会子女答谢词
2014/01/28 职场文书
小班上学期评语
2014/05/05 职场文书
公司活动总结范文
2014/07/01 职场文书
建设工程授权委托书
2014/09/22 职场文书
离婚上诉状范文
2015/05/23 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
七年级作文之英语老师
2019/10/28 职场文书