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 相关文章推荐
兼容ie和firefox js关闭代码
Dec 11 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
Dec 29 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
JavaScript生成福利彩票双色球号码
May 15 Javascript
javascript执行环境及作用域详解
May 05 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
Aug 02 Javascript
js实现延迟加载的几种方法
Apr 24 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
Vue 按键修饰符处理事件的方法
May 04 Javascript
vue+axios 前端实现的常用拦截的代码示例
Aug 23 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
PHP curl使用实例
2015/07/02 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
js闭包用法实例详解
2016/12/13 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
angular十大常见问题
2017/03/07 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
js验证密码强度解析
2020/03/18 Javascript
Python break语句详解
2014/03/11 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
对Python实现累加函数的方法详解
2019/01/23 Python
24式加速你的Python(小结)
2019/06/13 Python
python制作朋友圈九宫格图片
2019/11/03 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
python3中数组逆序输出方法
2020/12/01 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
C语言基础笔试题
2013/04/27 面试题
初三学习决心书
2014/03/11 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
长城的导游词
2015/01/30 职场文书