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 相关文章推荐
javascript判断iphone/android手机横竖屏模式的函数
Dec 20 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
Sep 19 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
C#中使用迭代器处理等待任务
Jul 13 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
Oct 30 Javascript
JS去除重复并统计数量的实现方法
Dec 15 Javascript
bootstarp modal框居中显示的实现代码
Feb 18 Javascript
Angular实现购物车计算示例代码
Feb 21 Javascript
webpack vue项目开发环境局域网访问方法
Mar 20 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 Javascript
vue 如何使用递归组件
Oct 23 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读取xml方法介绍
2013/01/12 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
2013/06/06 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
php实现socket推送技术的示例
2017/12/20 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
为什么JavaScript没有块级作用域
2016/05/22 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
React-Native中props具体使用详解
2017/09/04 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
简谈创建React Component的几种方式
2019/06/15 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
python绘制彩虹图
2019/12/16 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
党员年终民主评议的自我评价
2013/11/05 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
高一军训决心书
2015/02/05 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
python requests模块的使用示例
2021/04/07 Python