函数的副作用

什么是函数的副作用

指调用函数的时候,除了返回函数值之外,还对调用函数产生附加的影响。例如:修改了全局的变量或者修改了参数

函数的副作用会造成什么样的后果

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

函数副作用相关的几个概念

纯函数
输入输出数据流全是显式的。显式的意思是,函数与外界交换数据只有一个唯一的渠道——参数和返回值。函数从函数外部接收的所有输入都通过参数传递到该函数的内部。函数输出的所有外部信息都通过返回值传递到函数外部。

非纯函数
与之相反。 隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如读取/修改全局变量,都叫作以隐式的方式和外界进行数据交换。

引用透明
引用透明的概念与函数的副作用相关,且受其影响。 如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。

引用透明与函数副作用的结合
以下示例说明了引用透明与函数副作用的结合

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.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,795评论 8 265
  • 一 风道人 常宪向来对巫祝甄仪的话言听计从。十五年来,他从一个小小的编修升为手握重权的的左丞相,全靠了甄仪每次精...
    金大酱阅读 835评论 0 50
  • 我在学习写作的运动场上奔跑了三十年,不平凡的三十年啊! 我在文学的海洋里摸爬滚打了三十年,不容易的三十年啊! 我学...
    盲人王大文阅读 397评论 6 12
  • 1 2018年3月18日上午10点59分,作家李敖与世长辞,享年83岁。 因为之前看过他在北大的...
    仰望天空的咸鱼阅读 435评论 0 0
  • 那年大了好大的雪,白小兰给她儿子打电话,让她儿子多穿些衣服。刚挂电话,白小兰的异国的父母打电话让她多穿些衣服……是...
    星空下的雪花阅读 128评论 0 0