Przykład:
Zamiast tworzyć funkcję wykorzystującą setInterval() czyli przykładowo:
(function() {
var exampleFunction = function(){
// robię coś tutaj
};
setInterval(exampleFunction, 1000);
}());
To tworzę funkcję wywołaną przez setTimeout() z rekurencją czyli:
(function() {
var exampleFunction = function(){
// robię coś tutaj
// kolejną linię wykonuję jak skończę powyższe
setTimeout(exampleFunction, 1000);
};
setTimeout(exampleFunction, 1000);
}());
Powodem jest fakt(w zależności co robi funkcja), że przy wywołaniu setInterval(exampleFunction, 1000) będzie wykonywania niezależnie od czegokolwiek co sekundę. Teraz w momencie, gdy nasza funkcja dostanie jakiegoś błędu w trakcie działania, niezależnie od tego zostanie wywołana kolejny raz. W takim przypadku błędy mnożą się i w efekcie przeglądarka(w zależności od tego jakiego kalibru operacje wykonuje funkcja) może się zawieszać, a interfejs nie działać poprawnie.
Drugim powodem jest też sytuacja, w której czas między wywołaniami jest bardzo krótki. W takiej sytuacji raz wywołana funkcja może jeszcze nie zakonczyć działań np. na DOMie, a już kolejna funkcja będzie zmieniała to samo co może skutkować różnie.
W przypadku drugiego przykładu powyżej z funkcją setTimeout() w momencie błędu funkcja nie wywoła siebie po raz kolejny. W lepszym przypadku nawet sama funkcja może zadecydować, czy wywoła się kolejny raz czy raczej jest mocno źle i przerwie wywoływanie. setTimeout() także nie wywoła się szybciej niż przed zakonczeniem operacji tak więc druga niepożądana sytuacja też nie wystąpi.
Wadą takiego wzorca jest to, że przed wywołaniem setTimeout() po raz kolejny oprócz tej jednej sekundy oczekiwania dochodzi nam dodatkowy czas wykonywania się operacji wewnątrz funkcji.
Tak więc wzorzec ten ma wady i zalety - należy go stosować adekwatnie do sytuacji.
Jeśli możesz rozwinąć temat to z chęcią się dowiem co o tym myślisz.
Dzięki!