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取得鼠标绝对位置程序代码介绍
Sep 16 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 Javascript
javascript文本模板用法实例
Jul 31 Javascript
JavaScript function函数种类详解
Feb 22 Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 Javascript
常用的js验证和数据处理总结
Aug 02 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
浅谈JavaScript find 方法不支持IE的问题
Sep 28 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
详解Vue router路由
Nov 20 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
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
php数组去重复数据示例
2014/02/25 PHP
PHP生成压缩文件实例
2015/02/07 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
经理管理专业自荐信范文
2013/12/31 职场文书
三八妇女节慰问信
2015/02/14 职场文书
初中历史教学反思
2016/02/19 职场文书
五年级语文教学反思
2016/03/03 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
Nginx配置Https安全认证的实现
2021/05/26 Servers
2022漫威和DC电影上映作品
2022/04/05 欧美动漫