The two conditions that define a function as pure
are as follows:
If the first condition is always true, are there any times the second condition is not true?
I.e. is it really only necessary with the first condition?
Here are a few counterexamples that do not change the outer scope but are still considered impure:
function a() { return Date.now(); }
function b() { return window.globalMutableVar; }
function c() { return document.getElementById("myInput").value; }
function d() { return Math.random(); }
(which admittedly does change the PRNG, but is not considered observable)Accessing non-constant non-local variables is enough to be able to violate the second condition.
I always think of the two conditions for purity as complementary:
The term side effect only refers to the first, the function modifying the non-local state. However, sometimes read operations are considered as side effects as well: when they are operations and involve writing as well, even if their primary purpose is to access a value. Examples for that are generating a pseudo-random number that modifies the generator's internal state, reading from an input stream that advances the read position, or reading from an external sensor that involves a "take measurement" command.