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 相关文章推荐
ajax 文件上传应用简单实现
Mar 03 Javascript
如何将JS的变量值传递给ASP变量
Dec 10 Javascript
JQuery实现表格中相同单元格合并示例代码
Jun 26 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
Jan 13 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
Jun 12 Javascript
jQuery 实现评论等级好评差评特效
May 06 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
Ajax使用原生态JS验证用户名是否存在
May 26 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
VUE实现密码验证与提示功能
Oct 18 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
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python进行数据提取的方法总结
2016/08/22 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
DBA的职责都有哪些
2012/05/16 面试题
如何写出好的Java代码
2014/04/25 面试题
管理科学大学生求职信
2013/11/13 职场文书
八年级美术教学反思
2014/02/02 职场文书
贷款委托书范本
2014/04/08 职场文书
交通安全寄语大全
2014/04/08 职场文书
请假条标准格式规范
2014/04/10 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
法制主题班会教案
2015/08/13 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
详解MySQL集群搭建
2021/05/26 MySQL