将函数定义为纯
的两个条件如下:
- 无副作用(即只允许更改局部范围)
- 给定相同的输入总是返回相同的输出
如果第一个条件总是为真,那么第二个条件是否有任何时候不为真?
即真的只需要满足第一个条件吗?
最佳答案
下面是一些不改变外部作用域但仍然被认为是不纯的反例:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return document.getElementById("myInput").value; }
function d() { return Math.random(); }
(这确实改变了 PRNG,但不被认为是可观察的)
访问非常量非局部变量足以违反第二个条件。
我一直认为纯度的两个条件是互补的:
- 结果评估不得对状态产生影响
- 评估结果不得受到副状态的影响
术语 side effect仅指第一个,修改非局部状态的函数。然而,有时读取操作也被视为副作用:当它们是操作并且也涉及写入时,即使它们的主要目的是访问一个值。这方面的示例包括生成修改生成器内部状态的伪随机数、从推进读取位置的输入流中读取,或从涉及“进行测量”命令的外部传感器读取。
关于javascript - 纯函数 : Does "No Side Effects" Imply "Always Same Output, Given Same Input"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54992302/