纯函数、非纯函数和函数副作用
2025-05-19
Note
JavaScript 是一个函数优先的语言,因此对函数类别理解非常重要。
纯函数
维基百科 对纯函数的定义:
输入输出数据流全是显式(Explicit)的
即函数的返回值仅依赖函数的参数和函数内部的变量。例如 sum
函数,其返回值仅依赖输入参数:
const sum = (...args: number[]) => args.reduce((prev, curr) => prev + curr, 0)
非纯函数
如果一个函数从外界“隐式”获取数据,那么这个函数就不是纯函数,例如 compare
函数依赖了外部变量:
const PI = Math.PIfunction compare(n: number) { return n > PI}
详见 维基百科。
函数副作用
维基百科 对副作用的介绍:
函数副作用(side effect)指当调用函数时,除了返回可能的函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量),修改参数,向主调方的终端、管道输出字符或改变外部存储信息等。
通俗来讲,函数副作用修改了函数作用域外部的变量,在我们刚学习 JavaScript 时很常见,例如点击按钮 +1 的场景:
let count = 0btn.onclick = () => { DOM.innerHTML = count++}
总结
按照 维基百科 的比较严格的说法,以函数优先的编程语言必须保证函数无副作用,副作用会使得程序阅读非常困难,难以 DEBUG。但是有些副作用可以带来正向影响,例如 React 中的 useEffect
借助副作用实现同步等功能。
纯函数的好处主要有几点:
- 无状态,线程安全,不需要线程同步。
- 纯函数相互调用组装起来的函数,还是纯函数。
- 应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度。
为什么有这篇文章
本质上是公司代码中有 RxJS,想学一下前置知识。
实则是扩展一下自己的知识。
评论区