纯函数

晦涩的定义是这样的:一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用;

总共2点:

  1. 结果只依赖参数
  2. 执行过程中没有副作用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// demo1
const a = 1
const foo = (b) => a + b
foo(2) // => 3


// demo2
const a = 1
const foo = (x, b) => x + b
foo(1, 2) // => 3


// demo3
const a = 1
const foo = (obj, b) => {
return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2) // => 3
counter.x // => 1


// demo4
const a = 1
const foo = (obj, b) => {
obj.x = 2
return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2) // => 4
counter.x // => 2

// demo5
const foo = (b) => {
const obj = { x: 1 }
obj.x = 2
return obj.x + b
}

分析
1、demo1: 不是。 因为函数结果还依赖了外部变量a
2、demo2: 是。
3、demo3: 是。 只依赖入参,不产生副作用
4、demo4: 不是。 产生副作用。修改了obj.x的值
5、demo5: 是。 对内部变量obj的修改,外部程序不可见,无副作用

  • 副作用都包含哪些?
    1、调用 DOM API 修改页面;
    2、发送了 Ajax 请求;
    3、调用 window.reload 刷新浏览器;
    4、甚至是 console.log 往控制台打印数据;