首页前端开发正文

纯函数允许我们并发地执行代码

朱绪2021-11-16196JavaScript

下面是一段非纯函数的代码:

let global = "something"
let fn1 = (input) => {
//处理input
//改变global
  global = "somethingElse"
}
let fn2 = () => {
  if(global === "something") {
    //业务逻辑
  }
}

倘若我们需要并发地执行fn1和fn2,假设线程一(T-1)选择fn1执行,线程二(T-2)选择fn2执行。

现在两个线程都准备好执行了,那么问题来了,如果T-1在T-2之前执行,会发生什么?

由于fn1和fn2这两个函数都依赖全局变量global,并发地执行这些函数就会引起不良的影响。

我们将fn1和fn2都改为纯函数:

let fn1 = (input, global) => {
  //处理input
  //改变global
  global = "somethingElse"
}
let fn2 = (global) => {
  if(global === "something") {
    // 业务逻辑
  }
}

我们移动了global变量,将其作为两个函数的参数,使它们变成纯函数。

现在就可以并发地执行这两个函数了,而不会带来任何问题。

由于函数不依赖外部环境(global变量),因此我们不必担心线程的执行顺序。