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 相关文章推荐
判断iframe是否加载完成的完美方法
Jan 07 Javascript
onmouseover和onmouseout的一些问题思考
Aug 14 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
jQuery基本筛选选择器实例代码
Feb 06 Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
javascript定时器取消定时器及优化方法
Jul 08 Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 Javascript
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
node-red File读取好保存实例讲解
Sep 11 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
Sep 30 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/10/25 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
js中new一个对象的过程
2017/02/20 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
python中enumerate的用法实例解析
2014/08/18 Python
详解python之配置日志的几种方式
2017/05/22 Python
python清除函数占用的内存方法
2018/06/25 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL