定义:
副作用的函数不仅仅返回了一个值, 还做了其他事情
比如说,操作系统文件、操作数据库、发送http请求、console.log、修改全局变量
目的:
在JS中,我的目的不是完全消除副作用,而是避免不必要的副作用. 比如说,在项目开发中,我们在处理一些事情之后,要请求接口,发送http请求,这些都是副作用.我们没有办法避免,也不需要避免.
如果没有副作用的话,我们的程序只能用于计算.
具体的解释:
function test(a, b) {
return a + b
}
const result = test(1, 2)
这种就是一种无副作用的函数,传入什么就输出什么.没有引起外界的任何变化.完全无副作用的函数,我们也称其为 纯函数,也可以叫 幂等函数.
纯函数的定义是: 输入和输出的数据都是显式的
即内部的所有参数都是入参的形式进入函数内部,返回值也仅仅是由retrun出去.
反之就是非纯函数.
我们可以通过map和pop的例子知道这两种函数的明显区别:
const arr = [1, 2, 3]
const item = arr.pop()
console.log(item) // 3
console.log(arr) // [1, 2]
pop()很明显的改变了外边arr的结果,所以它是一个 非纯函数
const arr [1, 2, 3]
const arr2 = arr.map(num => {
return num + 1
})
console.log(arr) // [1, 2, 3]
console.log(arr2) // [2, 3, 4]
map没有改变原数组, 纯函数
当然面对的情况, 我们可以手动让它变成局部副作用函数,如此可以减少对于全局的干扰.使用一个函数包裹着, 使其内部变成一个黑盒子.
具体如下:
const arr = [1, 2, 3]
const myPop = (arr) => {
const [...cloneArr] = arr
return cloneArr.pop()
}
const arr2 = myPop(arr)
引用透明性是它的另外的一个概念.
定义是对于纯函数而言,给定相同的参数,返回值相同,所以我们可以用计算值代替纯函数的调用.
看下面代码
const sum = (val) => {
let number = 0
for (let i = 0; i < val; i++) {
number +=i
}
return number
}
sum(2) // 1
sum(3) // 3
上面的代码我们可以使用 1 + 3来代替 sum(2) + sum(3)的运算.这就是对