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 相关文章推荐
动态为事件添加js代码示例
Feb 15 Javascript
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
js截取中英文字符串、标点符号无乱码示例解读
Apr 17 Javascript
JavaScript中的splice()方法使用详解
Jun 09 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
详解Vue之父子组件传值
Apr 01 Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 Javascript
Node.js API详解之 zlib模块用法分析
May 19 Javascript
React实现评论的添加和删除
Oct 20 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 动态多文件上传
2009/01/18 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
Python中%r和%s的详解及区别
2017/03/16 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
python数据预处理方式 :数据降维
2020/02/24 Python
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
文员个人的求职信范文
2013/09/26 职场文书
实习护士自荐信
2014/06/21 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2015年市场营销工作总结
2015/07/23 职场文书