js 函数的副作用分析


Posted in Javascript onAugust 23, 2011

函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。
函数的副作用相关的几个概念, Pure Function、 Impure Function、 Referential Transparent。
纯函数 ( Pure Function )
输入输出数据流全是显式(Explicit)的。 显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值。函数从函数外部接受的所有输入信息都通过参数传递到该函数内部。函数输出到函数外部的所有信息都通过返回值传递到该函数外部。
非纯函数 ( Impure Function )
与之相反。 隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如读取/修改全局变量,都叫作以隐式的方式和外界进行数据交换。
引用透明 ( Referential Transparent )
引用透明的概念与函数的副作用相关,且受其影响。 如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。
以下示例说明了引用透明与函数副作用的结合

result1 = (fun(a) + b) / (fun(a) -c); 
temp = fun(a); 
result2 = (temp + b) / (temp -c);

如果函数没有副作用,那么result1和result2将是等价的。然而如果fun有副作用,比如让b或c加1,那么result1和result2将不相等。因此,副作用违背了引用透明性。
在JavaScript中,引入了函数。但显然JS中的函数可以访问、修改全局变量(或定义在函数外的变量),如下
var a = 5; 
function fun(){ 
a = 10; 
} 
fun(); // a 变成了10

JS中要想保证函数无副作用这项特性,只能依靠编程人员的习惯,即
1,函数入口使用参数运算,而不修改它
2,函数内不修改函数外的变量,如全局变量
3,运算结果通过函数返回给外部(出口)
Javascript 相关文章推荐
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
js正则表达式验证邮件地址
Nov 12 Javascript
跟我学习javascript的隐式强制转换
Nov 16 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
js css+html实现简单的日历
Jul 14 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
收集前端面试题之url、href、src
Mar 22 Javascript
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
May 31 Javascript
Vue 实现一个命令式弹窗组件功能
Sep 25 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 Javascript
javascript 运算数的求值顺序
Aug 23 #Javascript
读jQuery之十四 (触发事件核心方法)
Aug 23 #Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 #Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
Aug 23 #Javascript
jquery 回车事件实现代码
Aug 23 #Javascript
基于jquery的大众点评,分类导航实现代码
Aug 23 #Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
Aug 23 #Javascript
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
浅谈Python单向链表的实现
2015/12/24 Python
python 爬取微信文章
2016/01/30 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python中eval与int的区别浅析
2019/08/11 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
python时间time模块处理大全
2020/10/25 Python
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
卫校毕业生自我鉴定
2013/10/31 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
安全承诺书
2015/01/19 职场文书
葬礼主持词
2015/07/02 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书