Hoje venho mostrar um pouco de programação funcional, mostrando o que são funções puras e impuras.
O que é uma função pura?
É uma função que não altera o escopo geral da aplicação e o retorno dessa função depende apenas dos parâmetros e não de fatores externos. E precisa gerar os mesmos resultados, com os mesmos parâmetros então ela precisa ser totalmente determinística e não possuir valores colaterais observáveis.
Abaixo mostro um exemplo de uma função pura que atende os critérios.
function somar(valor1, valor2){
return valor1+valor2;
}
console.log(somar(10,20);
console.log(somar(10,20);
console.log(somar(10,20);

Essa função é pura, primeiramente pelo motivo de que não depende de nenhum valor externo, todos os valores estão sendo passados pelo parâmetro da função. Ela não muda nenhum estado da aplicação e é determinística.
O que é uma função impura?
A função impura é aquela função que depende do valor externo para obter um valor final. Ela não retorna o mesmo resultado utilizando as mesmas entradas podendo retornar valores diferentes para cada chamada de função, abaixo mostro um exemplo.
function numeroAleatorio(min, max){
return parseInt(Match.random() * (max - min + 1)) + min;
}
console.log(numeroAleatorio(1, 100));
console.log(numeroAleatorio(1, 100));
console.log(numeroAleatorio(1, 100));

A função mostrada acima ela é impura pois ela não é determinística. Mesmo colocando os valores de entrada de 1 e 100 o valor retornado sempre será diferente.
let contador = 0
function somar(valor1, valor2){
contador++
return valor1+valor2;
}
console.log(contador);
console.log(somar(10+20);
console.log(somar(10+20);
console.log(contador);
Acima mostro um outro exemplo de função impura, pois ela possui um efeito colateral observável que no caso seria a variável contador.
Ao ter uma função que faça uma conexão com o banco de dados, ela é uma função impura, mesmo que seja apenas para leitura, pois o valor não é determinístico e estou dependendo de um fator externo.
Em seus projetos você irá usar os dois tipos de funções inúmeras vezes. Porém sempre priorize utilizar funções puras, pois ao testar elas ficam mais fácil. Em determinado momento será necessário usar funções impuras, quando chegar a hora faça encapsulado em um função separada das funções puras, assim seu código estará mais limpo.