Друзья, Вам наверное уже известно, что для отмера временных интервалов в Javascript имеется две похожих функции — setTimeout() и setInterval().
ptr = setTimeout(func, timeout);
ptr = setInterval(func, timeout);
Разница в них такая, что setTimeout() отрабатывает ровно один раз, т.е. вызывает через указанный интервал указанную функцию и останавливает свою работу. Вторая функция же, setInterval() принимает точно такие же параметры, но вызвав функцию однажды, она продолжает делать это снова и снова через одинаковые промежутки времени. Остановить её работу можно только с помощью функции clearInterval(ptr), где ptr — ссылка на объект, полученная как результат выполнения функции setInterval().
Можно ли во всех ситуациях применять только первую функцию или только вторую? Или в некоторых ситуациях удобнее применять одну, а в других другую? Давайте рассмотрим подробнее.
Очевидно, что setTimeout() удобнее там, где нам не нужна многократная обработка, а нужен только однократный вызов некоего куска программы. По сути это — однократный таймер задержки. Можно в вызванном обработчике запустить новый setTimeout() и тем самым организовать циклическое выполнение кода с возможностью прервать выполнение в любой момент (для разрыва цикла можно просто очередной раз не создавать новый setTimeout()).
Но в последнем свойстве setTimeout() кроется засада и частая ошибка начинающих программистов.
Некоторые начинают использовать эту функцию для реализации секундного таймера для часов или подобных реалтаймных вещей, причём я видел данную ошибку даже на больших и уважаемых сайтах. Друзья! Категорически нельзя использовать setTimeout() как счётчик секунд! Ведь от момента, когда вызван обработчик и до момента, когда запущен новый цикл setTimeout() всегда проходит некоторое время! Даже сама функция setTimeout() требует для своего запуска несколько микросекунд! В итоге получается такое, что через несколько минут работы такого «таймера» секунды начинают достаточно заметно отличаться от действительных!
Я так же видел, что некоторые замечают это и пытаются компенсировать отставание путём установки задержки не в 1000 микросекунд, а, скажем, 996 (получают экспериментально). Но соль в том, что это значение для каждого клиентского компьютера разное, ведь быстродействие компьютеров и даже разных браузеров разное.
В то же время setInterval() лишена такого недостатка, так как в момент, когда вызван ваш обработчик, функция уже начала отсчёт следующего интервала, то есть длительность её интервалов не зависит от вашего кода.
Вот пожалуй и всё на сегодня. Спасибо за внимание.