Existe alguma diferença?
Sim. Um Timeout executa uma certa quantidade de tempo depois que setTimeout () é chamado; um intervalo executa uma certa quantidade de tempo após o intervalo anterior ser disparado.
Você notará a diferença se a função doStuff () demorar um pouco para ser executada. Por exemplo, se representarmos uma chamada para setTimeout / setInterval com .
, um disparo do tempo limite / intervalo com *
e da execução do código JavaScript com [-----]
, as linhas de tempo se parecerão com:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
A próxima complicação é se um intervalo for disparado enquanto o JavaScript já estiver ocupado fazendo alguma coisa (como lidar com um intervalo anterior). Nesse caso, o intervalo é lembrado e acontece assim que o manipulador anterior termina e retorna o controle ao navegador. Por exemplo, para um processo doStuff () que às vezes é curto ([-]) e às vezes longo ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• representa um intervalo de disparo que não pôde executar seu código imediatamente e foi feito pendente.
Portanto, os intervalos tentam 'recuperar o atraso' para voltar ao cronograma. Porém, eles não enfileiram um em cima do outro: só pode haver uma execução pendente por intervalo. (Se todos estivessem na fila, o navegador ficaria com uma lista cada vez maior de execuções pendentes!)
. * • • x • • x
[------][------][------][------]
x representa um intervalo de disparo que não pôde ser executado ou ficou pendente; portanto, foi descartado.
Se sua função doStuff () normalmente demorar mais para ser executada do que o intervalo definido para ela, o navegador consumirá 100% da CPU tentando atendê-la e poderá se tornar menos responsivo.
Qual você usa e por quê?
Tempo limite encadeado fornece um slot garantido de tempo livre para o navegador; O intervalo tenta garantir que a função que está sendo executada seja executada o mais próximo possível dos horários programados, à custa da disponibilidade da interface do usuário do navegador.
Eu consideraria um intervalo para animações únicas que gostaria de ser o mais suave possível, enquanto os intervalos encadeados são mais educados para animações em andamento que ocorreriam o tempo todo enquanto a página é carregada. Para usos menos exigentes (como um atualizador trivial disparando a cada 30 segundos ou algo assim), você também pode usá-lo com segurança.
Em termos de compatibilidade do navegador, setTimeout é anterior a setInterval, mas todos os navegadores que você encontrará hoje são compatíveis com ambos. O último retardatário por muitos anos foi o IE Mobile no WinMo <6,5, mas espero que agora também esteja atrás de nós.