Plumbiu
banner
avatar
Plumbiu
这人很勤奋,啥都没留

纯函数、非纯函数和函数副作用

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,想学一下前置知识

实则是扩展一下自己的知识。

评论区
CC BY-NC-SA 4.0 2024 © Plumbiu