什么是函数的副作用——理解js编程中函数的副作用

时间: 2018-10-22阅读: 6930标签: 函数

什么是函数副作用?

函数副作用是指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。副作用的函数不仅仅只是返回了一个值,而且还做了其他的事情,比如:

1、修改了一个变量
2、直接修改数据结构
3、设置一个对象的成员
4、抛出一个异常或以一个错误终止
5、打印到终端或读取用户输入
6、读取或写入一个文件
7、在屏幕上画图


函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性,严格的函数式语言要求函数必须无副作用。   


纯函数 ( 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,运算结果通过函数返回给外部(出口)  


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1176

JavaScript push() 方法详解

push() 方法主要用于向数组的末尾添加一个或多个元素,其返回值为添加后新的长度,即push后的数组长度,该值为number类型。介绍:一个数组中添加新元素、把一个数组的值赋值到另一个数组上、在对象使用push

javascript中的匿名方法(函数)是什么?

方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。JavaScript中的匿名方法即匿名函数是没有函数名称的函数。

JavaScript中的高阶函数

在 JavaScript 的学习过程中,我们可能或多或少地接触过高阶函数。那么,我们自己对此是否有一个明确的定义,或者说很熟练的掌握这些用法呢

10个非常实用的Js工具函数

生成一周时间new Array 创建的数组只是添加了length属性,并没有实际的内容。通过扩展后,变为可用数组用于循环,类型判断判断核心使用Object.prototype.toString,这种方式可以准确的判断数据类型。

Js Function函数深入总结

整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下文,私有变量等知识点的深入理解。

js在excel的编写_excel支持使用JavaScript自定义函数编写

微软 称excel就实现面向开发者的功能,也就是说我们不仅可以全新定义的公式,还可以重新定义excel的内置函数,现在Excel自定义函数增加了使用 JavaScript 编写的支持,下面就简单介绍下如何使用js来编写excel自定义函数。

Js中函数式编程

最近和做技术的朋友聊天的时候,发现自己居然不能将函数式编程思想讲清楚,于是做一次复习,常常都能听到这么一句话:在 JavaScript 中,函数是“一等公民”,这句话到底意味着什么?

Js函数记忆

函数记忆是一种编程技巧,通过牺牲算法的空间复杂度以换取更优的时间复杂度。定义: 若传递的参数一致,则通过缓存读取存取计算结果的一种编程技巧

编写小而美函数的艺术

随着软件应用的复杂度不断上升,为了确保应用稳定且易拓展,代码质量就变的越来越重要。不幸的是,包括我在内的几乎每个开发者在职业生涯中都会面对质量很差的代码。这些代码通常有以下特征:

JS高阶函数reduce()的常用场景

reduce()语法:必需。初始值, 或者计算结束后的返回值。 数组求和;数组最大值;数组去重;计算数组中每个元素的出现的次数

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!