Подтвердить что ты не робот

Являются ли clearTimeout и clearInterval одинаковыми?

При работе над некоторым Javascript для веб-приложения я заметил, что использовал setTimeout, но я попытался очистить его с помощью clearInterval, и он остановил тайм-аут в Google Chrome и Internet Explorer 9.

Являются ли clearTimeout и clearInterval взаимозаменяемыми?

Здесь JSfiddle с примером того, о чем я говорю.

4b9b3361

Ответ 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

Даже если они могут использоваться синонимом, теперь это может измениться в любое время в будущем. Почему бы тебе не называть лопату лопатой?: -)