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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
jQuery的三种$()
Dec 30 Javascript
js 金额文本框实现代码
Feb 14 Javascript
jquery 页面滚动到指定DIV实现代码
Sep 25 Javascript
JS动画效果打开、关闭层的实现方法
May 09 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
Oct 30 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
JS使用插件cryptojs进行加密解密数据实例
May 11 Javascript
AngularJS页面带参跳转及参数解析操作示例
Jun 28 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 Javascript
js观察者模式的弹幕案例
Nov 23 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中PDO的错误处理
2011/09/04 PHP
php页面缓存方法小结
2015/01/10 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
Python内置的字符串处理函数整理
2013/01/29 Python
sqlalchemy对象转dict的示例
2014/04/22 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
Python3 Random模块代码详解
2017/12/04 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
计算机专业毕业生自我鉴定
2014/01/16 职场文书
出国留学经济担保书
2014/04/01 职场文书
2014年实验室工作总结
2014/12/03 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
团干部培训班心得体会
2016/01/06 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
解决Redis启动警告问题
2022/02/24 Redis
索尼ICF-36收音机评测
2022/04/30 无线电