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 页面只自动刷新一次
Jul 10 Javascript
jQuery实现点击标题输入详细信息
Apr 16 Javascript
js中复制行和删除行的操作实例
Jun 25 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
如何使用jquery easyui创建标签组件
Nov 18 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
Feb 23 Javascript
JavaScript基础心法 数据类型
Mar 05 Javascript
layui中table表头样式修改方法
Aug 15 Javascript
vue中slot(插槽)的介绍与使用
Nov 12 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
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
isset和empty的区别
2007/01/15 PHP
据说是雅虎的一份PHP面试题附答案
2009/01/07 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php获取字段名示例分享
2014/03/03 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
Vue实现点击当前行变色
2020/12/14 Vue.js
python strip()函数 介绍
2013/05/24 Python
python pandas 时间日期的处理实现
2019/07/30 Python
python多任务之协程的使用详解
2019/08/26 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python timeit模块原理及使用方法
2020/10/10 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
安全生产责任书范本
2014/04/15 职场文书