编程中的"副作用"是什么意思?

副作用,是相对于主要作用的,并不只是“坏”作用

因为“药物的副作用”,一直以来都没有很好的理解编程中 “副作用” 一词,想当然的把它理解为了 一些“负面”的作用

对于 “副作用” 科书版的解答就是:

  • “副作用”(side effect),指的是函数内部与外部互动,产生运算以外的其他结果。

但是很笼统,对于已经有刻板影响的中文世界,还是很容易曲解的。
正巧今天在水群的时候提到了这个词,发现其实还有很多人和我有一样的问题,并没有很好的理解。

特别是在 React 文档 中也提到了 副作用,虽然我现在看来其实很好理解,但是当时确实给我造成了一些困扰。

那我就用上边的这篇文档中提到的副作用来举例吧。

import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

这个示例主要功能是实现一个按钮点击累计 count,并且展示 count 的需求,
然后使用 useEffect() 在DOM更新后修改页面标题,这个修改页面标题就是这个函数的副作用。

另外一个例子就是群里边提到的 tree-shaking 中的副作用,表示的是项目不影响全局,不会增加减少全局的变量,也不会改变某个原型。
工具可以可以放心地优化掉代码,不需要考虑因为外部代码可能使用到了,该项目附加的属性方法而没办法进行优化。


总而言之,想表达意思其实是除了函数执行的主要目的(primary effect)之外,额外产生的一些附加的影响(side effect),这些附加的影响可能是无法预期的,会给程序带来不必要的麻烦,也可能是特意为止的,为了实现一些额外的操作。
所以并不是简单的字面理解为 “坏作用”,这个副作用可能会是正面的。

文档

副作用 (计算机科学) - 维基百科