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 相关文章推荐
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
Apr 12 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
分享Javascript中最常用的55个经典小技巧
Nov 29 Javascript
jquery预览图片实现鼠标放上去显示实际大小
Jan 16 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
Apr 30 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
VUE脚手架具体使用方法
May 20 Javascript
微信小程序wx.request拦截器使用详解
Jul 09 Javascript
小程序Request的另类用法详解
Aug 09 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
PHP写日志的实现方法
2014/11/05 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
vue实现添加标签demo示例代码
2017/01/21 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
Vue性能优化的方法
2020/07/30 Javascript
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
护理自荐信
2013/10/22 职场文书
化工机械应届生求职信
2013/11/04 职场文书
医院节能减排方案
2014/06/13 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
大学生暑期实践报告
2015/07/13 职场文书
小学体育组工作总结
2015/08/13 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
Python读写yaml文件
2022/03/20 Python