美文网首页
函数的副作用

函数的副作用

作者: Gopal | 来源:发表于2018-07-23 22:13 被阅读29次

什么是函数的副作用

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

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

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

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

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

非纯函数
与之相反。 隐式(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.运算结果通过函数返回给外部(出口)

相关文章

  • useEffect

    1. 理解函数副作用 本节任务: 能够理解副作用的概念 什么是副作用 副作用是相对于主作用来说的,一个函数除了主作...

  • 【vue3源码】一、认识副作用函数与响应式数据

    认识副作用函数与响应式数据 在分析vue3响应式的实现前,我们需要先搞清两个概念:副作用函数、响应式数据。 副作用...

  • 深入JavaScript Day07 - 纯函数、柯里化、组合函

    一、纯函数 1、什么是纯函数? 确定的输入,一定会产生确定的输出; 函数在执行过程中,不能产生副作用; 2、副作用...

  • immutable.js 和 immer

    不可变数据类型 immutable,副作用,纯函数关键词解释: immutable: 不可变数据 副作用:调用函数...

  • 纯函数

    纯函数的特点: 对于同一参数,返回同一结果 结果完全取决于传入的参数 不产生副作用 函数副作用是指函数在正常工作任...

  • 函数的副作用

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

  • 什么是函数式编程式编程

    函数式编程:只用纯函数构造程序纯函数:函数没有副作用副作用:1.修改一个变量2.直接修改数据结构3.设置一个对象的...

  • useEffect

    useEffect的含义:副作用钩子,用于处理组件中的副作用,用来取代生命周期函数。所谓的"副作用"就是指的是组件...

  • 前端基础—带你理解什么是函数式编程

    框架总览 ? 引言 ? 什么是函数式编程? ? 函数是纯函数? 什么是纯函数? 函数的副作用? 使用纯函数的优点?...

  • 一个很好的方式表示(无参)函数是否有副作用

    在scala中,因为不是纯函数式,所以一定会出现带有副作用的函数,那么有一个方式可以表示一个无参函数是否有副作用....

网友评论

      本文标题:函数的副作用

      本文链接:https://www.haomeiwen.com/subject/uretpftx.html