Проблема с setInterval
заключается в том, что это может в конечном итоге привести к резервному копированию. Это происходит потому, что механизм JavaScript пытается выполнить функцию с интервалом (в вашем случае, 10 мс), но если когда-либо это выполнение займет дольше , чем 10 мс, механизм JS начнет пытаться выполнить следующий интервал до того, как текущий останавливается (что на самом деле означает, что он ставит его в очередь для запуска, как только завершится предыдущий обратный вызов).
Поскольку JavaScript выполняется однопоточным (за исключением веб-работников в HTML 5), это может привести к паузам в ваших обновлениях пользовательского интерфейса или DOM, поскольку он постоянно обрабатывает обратные вызовы JavaScript из вашего setInterval
. В худшем случае вся страница может перестать отвечать на запросы, потому что ваш стек незавершенных setInterval
выполнений становится длиннее и длиннее, а не завершается полностью.
За некоторыми исключениями, обычно считается более безопасной ставкой использовать setTimeout
(и снова вызывать setTimeout
после выполнения обратного вызова) вместо setInterval
. С setTimeout
вы можете гарантировать, что один и только один тайм-аут когда-либо будет поставлен в очередь. А так как таймеры в любом случае являются только приблизительными (то, что вы указываете 10 мс, не означает, что это произойдет ровно при 10 мс), вы обычно ничего не получаете от использования setInterval
сверх setTimeout
.
Пример использования setTimeout
:
var count = function(){
// do something
// queue up execution once again
setTimeout(count, 10);
};
count();
Одна из причин, по которой вы можете увидеть паузы в некоторых браузерах, а не в других, заключается в том, что не все механизмы JavaScript созданы одинаковыми :). Некоторые из них быстрее, чем другие, и, следовательно, с меньшей вероятностью получат резервную копию setInterval
.