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 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
javascript正则表达式中参数g(全局)的作用
Nov 11 Javascript
JS案例分享之金额小写转大写
May 15 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
Jun 23 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 Javascript
浅谈JavaScript的全局变量与局部变量
Jun 10 Javascript
微信小程序 开发工具快捷键整理
Oct 31 Javascript
微信小程序 Nginx环境配置详细介绍
Feb 14 Javascript
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
VUE2.0+Element-UI+Echarts封装的组件实例
Mar 02 Javascript
微信小程序仿朋友圈发布动态功能
Jul 15 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
浅谈es6中的元编程
2020/12/01 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
python批量下载抖音视频
2019/06/17 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
介绍一下Java的安全机制
2012/06/28 面试题
Android面试题附答案
2014/12/08 面试题
新闻专业个人自我评价
2013/09/21 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
辞职申请书范本
2019/05/20 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript