函数副作用 指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。
函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。
函数的副作用相关的几个概念, 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,运算结果通过函数返回给外部(出口)
相关:
http://www.vcpc.univie.ac.at/information/mirror/HPFF/hpf1/hpf-v10/subsubsection2_5_3_1_1.html
分享到:
相关推荐
在编程中,函数副作用是指函数在执行过程中除了返回计算结果之外,对系统的其他部分产生的影响,尤其是对外部环境的修改。函数副作用的问题尤其在多线程编程中变得更加复杂和难以预测。JavaScript 作为一种广泛使用...
详细解释了什么是函数的副作用?纯函数即是没有副作用的函数,非纯函数即又副作用的函数。
4. **函数副作用**:函数副作用指的是除了返回值之外,函数调用还可能影响外部状态(如修改全局变量或参数)。在`add`函数的例子中,函数直接修改了传入的`vector`,这就是一个有副作用的例子。 5. **函数指针**:...
函数式编程是一种编程范式,它强调将计算视为数学函数的评估,并避免可变状态和副作用。这种编程风格鼓励使用纯函数,即那些输入相同输出始终一致且不改变外部状态的函数。函数式编程有着深厚的理论基础,源于λ演算...
9. 函数副作用:`subone`函数改变了形参的值,但由于是按值传递,不会影响到实参`b`的值。 10. 函数返回值类型:C++允许函数返回值类型为引用、指针、结构,但不允许是数组。 11. 默认参数:`Func(int a=0, int b=...
过程式语言支持并发处理,但安全性较低,如悬挂指针和函数副作用等问题。类型系统通常包括有限类型、指针、复合类型等,并允许对这些类型进行操作。常用的过程式语言有C和Pascal。 **面向对象编程**(Object-...
位运算、语句的求值次序以及函数副作用也是编程中需要注意的重要概念。位运算涉及对数据的二进制位进行操作,包括位与(&)、位或(|)、位非(~)、位异或(^)等运算符。在编程实践中,理解语句的求值次序和副作用对于编写...
函数式编程强调纯函数(pure functions)和不可变性(immutability),纯函数指的是相同的输入总是产生相同的输出,并且不产生任何可观察的副作用。 2. 高阶函数(Higher-order functions) JavaScript支持高阶...
函数式编程强调使用纯函数、避免副作用、函数的不可变性以及利用高阶函数等概念。通过阅读《JavaScript函数式编程指南》,读者可以了解到函数式编程的基本概念和实现技巧,并且会发现JavaScript作为函数式编程语言的...
函数副作用是函数除了返回值之外对程序其他部分产生的影响,如修改全局变量。这种行为可能会导致难以调试的问题。以下的`foo`函数就是一个具有副作用的例子,因为它改变了外部变量`a`的值: ```javascript let a = ...
深入讲解了函数的定义(Defining a function)、参数和作用域(Parameters and scopes)、嵌套作用域(Nested scope)、函数作为值(Functions...增长(Growing functions)和函数副作用(Functions and side effects)...
- 对象应通过初始化而不是赋值来创建,特别是对于那些有构造函数副作用的对象。 5. **项5:考虑使用初始化列表** - 构造函数的初始化列表能确保成员变量按正确的顺序初始化,并且在某些情况下比在函数体内部赋值...
函数式编程是一种编程范式,它强调通过使用纯函数、避免可变状态和副作用来解决问题。在JavaScript开发中,函数式编程的概念可以帮助我们编写出更简洁、可读性更强、易于测试和维护的代码。 纯函数是函数式编程的...
- 并行处理:由于函数式编程的纯函数没有副作用,它们可以在多线程环境中安全地并行执行。 - 可读性:通过使用函数组合,代码可以变得更加简洁和可读。 - 代码复用:函数式编程鼓励重用已存在的函数,减少重复...
一个纯函数是指一个函数对于相同的输入始终返回相同的输出,并且不产生任何可观察的副作用。这意味着纯函数可以被安全地重用,不会影响程序其他部分的状态。例如,字符串的toUpperCase方法是一个纯函数,因为对于...
函数式编程将值传递给函数,该函数然后生成新值但从不修改自身外部的任何东西,不可变对象和无副作用范式解决了并发编程中最基本和最棘手的问题之一。 函数式编程的特点: * 不可变数据:在函数式编程中,所有数据...