什么是函数副作用?

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

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

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

  1. php 代码延迟执行,php和js编程中的延迟执行效果的代码

    php和js编程中的延迟执行效果的代码 php sleep(10); usleep(10); js里的 setInterval("方法", 100); PHP sleep() 函数 ...

  2. python函数与方法的区别_python中函数和方法有哪些区别

    python中函数和方法有哪些区别 发布时间:2020-11-16 09:30:04 来源:亿速云 阅读:89 作者:小新 小编给大家分享一下python中函数和方法有哪些区别,相信大部分人都还不怎么 ...

  3. c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型

    关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...

  4. 用类比方式学习编程中函数递归(个人理解仅供参考)(内含汉诺塔问题的求解)

    目录 1.前言 2.递归的数学模型 3.相关的c语法 4.将递归的数学模型写成编程语言 5.利用类比方法将实际问题的代码写成函数递归的形式 例1: 例2: 6.汉诺塔问题的求解 1.前言 本人在学习函 ...

  5. 深入理解js立即执行函数

    看过jQuery源码的人应该知道,jQuery开篇用的就是立即执行函数.立即执行函数常用于第三方库,好处在于隔离作用域,任何一个第三方库都会存在大量的变量和函数,为了避免变量污染(命名冲突),开发者们 ...

  6. python中使用函数编程的意义_总结Python编程中函数的使用要点

    为何使用函数 最大化代码的重用和最小化代码冗余 流程的分解 编写函数 >>def语句 在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量 ...

  7. 编程软件python中的if用法-总结Python编程中函数的使用要点

    为何使用函数 最大化代码的重用和最小化代码冗余 流程的分解 编写函数 >>def语句 在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量 ...

  8. php内核函数手册,深入理解PHP内核(五)函数的内部结构,深入理解内部结构

    深入理解PHP内核(五)函数的内部结构,深入理解内部结构 php的函数包括用户定义的函数.内部函数(print_r count...).匿名函数.变量函数($func = 'print_r'; $fu ...

  9. python中函数的调用_慢步python,编程中函数的概念,python中函数的声明和调用

    函数,曾经是一个很高大尚的概念.笔者是在高中数学里认识的函数,先是从y=2x+3 这条代数式开始的.y是因变量,x是自变量,y因为x取值的变化而变化. 再后来式子变成这样:f(x)=2x+3,f(x) ...

最新文章

  1. 【数据结构总结】第二章:线性表
  2. ServiceNow 中关于UI Action 在portal端的使用
  3. python升级pip在哪儿打开_Linux下升级python和安装pip的详解
  4. leetcode 992. K 个不同整数的子数组(滑动窗口)
  5. input type='file' 上传文件时显示文件名及上传进度
  6. 一个代表年月的类YearMonth
  7. ASP.NET Web API 配置 JSONP
  8. IOS 10 微信 ajax readystate=0 status=0 解决方法
  9. Codeforces Round #468 (Div. 2): E. Game with String
  10. SpringBoot 项目(若依脚手架)2
  11. 详解Python曲线拟合
  12. 坤宝德万达打造命运共同体万达茂天樾之夜.时光发声全国巡回演唱会南宁站圆满结束
  13. Liunx查看系统版本
  14. 信息收集:CCF大学生计算机系统与程序设计竞赛(CCSP)
  15. .ipynb 和 .py 文件
  16. 信捷DS5B伺服驱动器Modbus控制程序编写
  17. 物联网发展存在的问题,具体有哪些?
  18. 记一次加湿器购买经历
  19. 手把手教学 | YOLOX的部署、优化及训练的实现全过程
  20. SpringMvc工作流程图讲解

热门文章

  1. 广积粮—筑高墙—缓称王
  2. appcan.frame.open打开的浮空窗口页面不开启弹动的情况下,也会有微微的滑动bug...
  3. Nepxion Discovery【探索】微服务企业级解决方案
  4. 21. 理解CNI和CNI插件
  5. php 支付宝用户信息授权,h5端支付宝第三方用户信息接口demo
  6. 日记侠:你的朋友圈能引流,你还不知道?
  7. Cisco Firepower 1000 Series FTD Software 7.1.0 ASA Software 9.17.1 下载
  8. windows系统mysql安装教程<手把手教学>
  9. Neutron 理解 (6): 如何实现虚拟三层网络
  10. 杭电ACM2026题