Hi FE !
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
  • 函数的副作用

函数的副作用

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

什么是 函数副作用?

函数副作用是指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。副作用的函数不仅仅只是返回了一个值,而且还做了其他的事情,比如: 1、修改了一个变量2、直接修改数据结构3、设置一个对象的成员4、抛出一个异常或以一个错误终止5、打印到终端或读取用户输入 函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性,严格的函数式语言要求函数必须无副作用。

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

Edit this page
最近更新: 2025/6/27 02:24
Contributors: qdleader
qdleader
本站总访问量 129823次 | 本站访客数 12人