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 相关文章推荐
验证码按回车不变解决方法
Mar 29 Javascript
详解maxlength属性在textarea里奇怪的表现
Dec 27 Javascript
js判断数组key是否存在(不用循环)的简单实例
Aug 03 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 Javascript
微信小程序分页加载的实例代码
Jul 11 Javascript
vue中mint-ui的使用方法
Apr 04 Javascript
Vue使用Proxy监听所有接口状态的方法实现
Jun 07 Javascript
vue transition 在子组件中失效的解决
Nov 12 Javascript
JS面向对象编程实现的拖拽功能案例详解
Mar 03 Javascript
antd Select下拉菜单动态添加option里的内容操作
Nov 02 Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 Javascript
详解javascript脚本何时会被执行
Feb 05 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生成EXCEL的东东
2006/10/09 PHP
Cannot modify header information错误解决方法
2008/10/08 PHP
php对数组排序的简单实例
2013/12/25 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
php自定文件保存session的方法
2014/12/10 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
jQuery:unbind方法的使用详解
2017/08/14 jQuery
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
celery4+django2定时任务的实现代码
2018/12/23 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
盛大二次面试题
2016/11/18 面试题
儿媳婚宴答谢词
2014/01/14 职场文书
青年文明号服务承诺
2014/03/31 职场文书
一分钟演讲稿
2014/04/30 职场文书
党支部对转正的意见
2015/06/02 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL