Являются ли clearTimeout и clearInterval одинаковыми?
При работе над некоторым Javascript для веб-приложения я заметил, что использовал setTimeout
, но я попытался очистить его с помощью clearInterval
, и он остановил тайм-аут в Google Chrome и Internet Explorer 9.
Являются ли clearTimeout
и clearInterval
взаимозаменяемыми?
Здесь JSfiddle с примером того, о чем я говорю.
Ответы
Ответ 1
Нет, они не взаимозаменяемы.
Конечно, некоторые браузеры могут очень хорошо использовать один и тот же код, чтобы очищать интервалы и тайм-ауты одинаково, но не означает, что они взаимозаменяемы, и вам, безусловно, не гарантировано, что они будут работать одинаково во всех реализациях браузера. Это связано с тем, что эти два метода определяются по-разному для разных целей, и поэтому вы должны использовать их для своих назначенных целей. В противном случае вы просто просите о проблемах.
Ответ 2
На самом деле я считаю, что мы можем сделать довольно сильный вывод из спецификации W3C (http://www.w3.org/TR/html5/webappapis.html#timers). Это явно не гарантировано, но у нас есть много доказательств того, что почти любая разумная реализация будет иметь такое поведение:
1) Тайм-ауты и интервалы фактически используют одну и ту же базовую функцию:
Метод setTimeout() должен возвращать значение, возвращаемое шагами инициализации таймера, передавая им аргументы метода... и флаг повторения установлен на false.
Метод setInterval() должен возвращать значение, возвращаемое таймером шаги инициализации, передавая им аргументы метода.... и флаг повторения установлен на true.
2) Эта единственная функция - "шаги инициализации таймера", упомянутые выше, - использует один список таймеров:
2,... пусть handle является целым числом, определяемым пользователем, которое больше нуля который будет определять таймаут, который должен быть установлен этим вызовом в списке активных таймеров.
10, Обратный дескриптор...
3) clearTimeout() и clearInterval() работают в этом списке (и фактически не различаются спецификацией каким-либо образом)
Методы clearTimeout() и clearInterval() должны очистить запись идентифицируется как дескриптор из списка активных таймеров Объект WindowTimers, на который был вызван метод, где handle аргумент передается методу, если таковой имеется. (Если ручка не определить запись в списке активных таймеров WindowTimers объект, на который был вызван метод, метод ничего не делает.)
Я считаю, что это довольно убедительный пример: clearTimeout и clearInterval должны быть синонимом по спецификации. Это подтверждается тем фактом, что это работает во всех браузерах, которые я тестировал (Chrome 37, Firefox 33 и Opera 25).
Ответ 3
Из ссылка на Mozilla:
Стоит отметить, что пул идентификаторов, используемый setTimeout() и setInterval() являются общедоступными, что означает, что вы можете технически использовать clearTimeout() и clearInterval() взаимозаменяемы. Однако для ясности, вы должны избегать этого.
Ответ 4
Даже если они могут использоваться синонимом, теперь это может измениться в любое время в будущем. Почему бы тебе не называть лопату лопатой?: -)