下面是一段非纯函数的代码:
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变量),因此我们不必担心线程的执行顺序。