Por que dizem que recursividade de setTimeout é melhor que setInterval?

Dizer que a recursividade de setTimeout é melhor que setInterval é um equívoco comum. Na verdade, ambas as abordagens têm seus usos e dependem dos requisitos do seu código.

A principal diferença entre as duas é como elas controlam o tempo entre as chamadas. Com o setInterval, você define um intervalo fixo entre as chamadas repetidas de uma função. Por exemplo, se você definir um setInterval com um intervalo de 1 segundo, a função será chamada a cada 1 segundo, independentemente de quanto tempo a função em si demora para ser executada.

Por outro lado, com a recursividade utilizando o setTimeout, você tem um controle maior sobre o tempo entre as chamadas. A função é chamada somente depois que ela completa sua execução. Isso permite que você ajuste o tempo dinamicamente com base na lógica do seu código. Por exemplo, se você estiver realizando uma animação onde o próximo quadro deve ser renderizado após a conclusão da renderização atual, você pode usar a recursividade de setTimeout para garantir que cada quadro seja renderizado após a conclusão da renderização anterior.

No entanto, é importante usar essa abordagem com cuidado. Se a função demorar mais tempo para ser executada do que o intervalo definido, o tempo entre as chamadas será maior do que o pretendido, o que pode levar a problemas de desempenho ou atrasar outras tarefas agendadas. Além disso, a recursão pode ser mais difícil de gerenciar em termos de controle de fluxo e leitura do código.

Em suma, a escolha entre setInterval e a recursão de setTimeout depende do contexto e dos requisitos do seu código. Se você precisa de chamadas repetidas em um intervalo fixo, setInterval pode ser mais adequado. Se você precisa ter um controle mais granular sobre o tempo entre as chamadas, a recursividade de setTimeout pode ser mais adequada.