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 相关文章推荐
js猜数字小游戏的简单实现代码
Jul 02 Javascript
判断js对象是否拥有某一个属性的js代码
Aug 16 Javascript
JS复制到剪贴板示例代码
Oct 30 Javascript
javascript特殊用法示例介绍
Nov 29 Javascript
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
JavaScript实现Java中StringBuffer的方法
Feb 09 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
JavaScript驾驭网页-获取网页元素
Mar 24 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
May 24 Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
深入了解query和params的使用区别
Jun 24 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常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
用vue写一个日历
2020/11/02 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Araks官网:纽约内衣品牌
2020/10/15 全球购物
.net C#面试题
2012/08/28 面试题
浪漫婚礼主持词
2014/03/14 职场文书
三项教育活动实施方案
2014/03/30 职场文书
促销活动总结
2014/04/28 职场文书
某某同志考察材料
2014/05/28 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python