函数的主要作用就是运行处理参数,返回一个值。
无参数的函数一般是副作用函数?
副作用函数
函数在运行过程中,除了返回值之外,改变了函数作用域外,程序的状态(数据变化),这些变化则称为副作用或作用(effect)。此函数也因此被称为副作用函数。
常见的副作用:
- 函数外变量的改变
- 函数外数据结构的变化,如改变复合数据类型参数值
- 抛出异常
- 控制台输出或读取用户输入
- 读取文件到内存中或者写入
- UI或DOM变化
副作用函数会使程序之间耦合增加,难以寻找处理错误,增加测试难度
纯函数
函数与函数外界的交流只有函数的参数和返回值,不与函数外界其他数据或东西进行交流访问。纯函数对于相同的输入参数总是返回相同的结果。
引用透明
如果可以用固定的值替代程序中的某一函数参数表达式,且不改变程序运行状态,则说明这个函数是引用透明的。
函数的返回值只依赖于其输入值,这种特性就称为引用透明性
function sum(x,y){
return x+y;
}
s1 = sum(2,2)+b;
s1 = 4+b;
如果前后2种s1的写法不会对程序产生任何变化,则说明sum是引用透明的。
由于引用透明不会对程序产生副作用,所以纯函数一定是引用透明的。
Vue3.0中的副作用函数
深入Vue响应式
如果一个副作用函数中,使用(getter)或者赋值(setter)了响应式数据,那么这个副作用函数会被作为这些响应式数据的订阅,响应式数据作为函数的依赖。
let A2
// A0,A1是响应式数据
function update() {
A2 = A0 + A1
}
update就是A0,A1的订阅,A0和A1叫做update副作用函数的依赖。副作用函数需要在依赖依赖更新的时候重新调用计算。
在副作用第一次使用依赖,进行运行时,会被track记录在订阅为key的WeakMap中。
在依赖被赋值时,在setter时,会通过trigger重新调用次依赖的订阅。