Na pierwszy rzut oka różnią się nadmiarowym kodem. Jednak jest jedna różnica, która jest bardzo istotna. Pierwsza wersja kodu spowoduje, że foo()
będzie wołane co około sekundę (chyba, że silnik js będzie zajęty czym innym, to wtedy dłużej). Druga wersja będzie wywoływać się co około sekundę + czas wykonania foo()
oraz ma jeden niebezpieczny błąd. Otóż jeśli kod foo()
będzie wywoływać się dłużej, niż długość interwału, to zanim zostanie wywołane clearInterval
nastąpi zakolejkowanie kolejnego wywołania foo
, a to doprowadzi do niekontrolowanego rozmnożenia wywołań foo()
.
Dlatego 1) nigdy clearInterval()
w środku obsługi tyknięcia interwału 2) jeśli potrzebujesz 1s od zakończenia obsługi tyknięcia, to użyj setTimeout()
.
Jest jeszcze jedna, tym razem drobna różnica - jeśli poleci wyjątek, to clearInterval/setInterval nie wykona się.
Jeśli z pewnych powodów chcesz za każdym razem ustawiać od nowa kolejne wywołanie, to użyj setTimeout
.
Maciej Cąderek