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 相关文章推荐
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
使用jquery解析XML示例代码
Sep 05 Javascript
修改或扩展jQuery原生方法的代码实例
Jan 13 Javascript
JavaScript中的this关键字使用方法总结
Mar 13 Javascript
js绘制圆形和矩形的方法
Aug 05 Javascript
简单了解JavaScript操作XPath的一些基本方法
Jun 03 Javascript
JS 面向对象之继承---多种组合继承详解
Jul 10 Javascript
js实现PC端和移动端刮卡效果
Mar 27 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
Oct 09 Javascript
JavaScript实现一个简易的计算器实例代码
May 10 Javascript
详解js访问对象的属性和方法
Oct 25 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
php mail to 配置详解
2014/01/16 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
jquery实现下载图片功能
2019/07/18 jQuery
JS实现使用POST方式发送请求
2019/08/30 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python中enumerate函数用法实例分析
2015/05/20 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
高三学习决心书
2014/03/11 职场文书
春节慰问简报
2015/07/21 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang