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中获取元素的几种方式小结
Jul 05 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
浅谈被jQuery抛弃的函数及替代函数
May 03 Javascript
jQuery侧边栏实现代码
May 06 Javascript
jQuery简单入门示例之用户校验demo示例
Jul 09 Javascript
vue2.0父子组件及非父子组件之间的通信方法
Jan 21 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 Javascript
详解vue父子组件间传值(props)
Jun 29 Javascript
node puppeteer(headless chrome)实现网站登录
May 09 Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 Javascript
小程序click-scroll组件设计
Jun 18 Javascript
JS获取动态添加元素的方法详解
Jul 31 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
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
Vue项目打包编译优化方案
2020/09/16 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
python3排序的实例方法
2020/10/20 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
党课学习思想汇报
2014/01/02 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏