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 相关文章推荐
浅析基于WEB前端页面的页面内容搜索的实现思路
Jun 10 Javascript
js图片模糊切换显示特效的方法
Feb 17 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
JavaScript实现的背景自动变色代码
Oct 17 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
Jan 18 Javascript
Node.js 进程平滑离场剖析小结
Jan 24 Javascript
解决Layui数据表格显示无数据提示的问题
Nov 14 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
基于JavaScript实现简单的轮播图
Mar 03 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 curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
详解php实现页面静态化原理
2017/06/21 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
js加解密 脚本解密
2008/02/22 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
13个PHP函数超实用
2015/10/21 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python django事务transaction源码分析详解
2017/03/17 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
几个MySql的面试题
2013/04/22 面试题
财务人员担保书
2014/05/13 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
初中体育课教学反思
2016/02/16 职场文书
高三物理教学反思
2016/02/20 职场文书