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 框架使用教程 AJAX篇
Oct 11 Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
Nov 02 Javascript
用正则表达式替换图片地址img标签
Nov 22 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
jquery实现的树形目录实例
Jun 26 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
作为老司机使用 React 总结的 11 个经验教训
Apr 08 Javascript
vue.js购物车添加商品组件的方法
Sep 17 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
Sep 26 Javascript
javascript全局自定义鼠标右键菜单
Dec 08 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP 第二节 数据类型之转换
2012/04/28 PHP
php实现读取内存顺序号
2015/03/29 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
Tesserocr库的正确安装方式
2018/10/19 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
深入学习python多线程与GIL
2019/08/26 Python
Python内置异常类型全面汇总
2020/05/28 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
财务副总经理工作职责
2013/11/25 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
党性分析自查总结
2014/10/14 职场文书
2015学校年度工作总结
2015/05/11 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
同学会演讲稿
2019/04/02 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
JS Canvas接口和动画效果大全
2021/04/29 Javascript
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
微信小程序实现聊天室功能
2021/06/14 Javascript
Python自动化测试PO模型封装过程详解
2021/06/22 Python