El concepto de función pura o de función impura viene dado por si el resultado de la función depende solamente de los parámetros o si depende de los parámetros y de otros factores. Para definir lo de una manera más formal sería:
Función Pura
Siempre devuelve el mismo resultado si se pasan los mismos parámetros.
Nunca depende de ningún estado/dato/cambio durante la ejecución de un programa.
Siempre devuelve algo.
Definir los casos de prueba será sencillo.
Algunas funciones puras: "Array.map()", "Array.reduce()", "Array.filter()", "Array.concat()".
Función Impura
Cambia el estado interno de cualquier parámetro que se haya pasado a la función.
Puede tener efecto sin devolver nada.
Escribir casos de prueba será un poco complicado.
Algunas funciones impuras: "Array.splice()", "Array.sort()", "Date.now()", "Math.random()".