Являются ли clearTimeout и clearInterval одинаковыми? - PullRequest
35 голосов
/ 28 марта 2012

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

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

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

Ответы [ 4 ]

24 голосов
/ 09 декабря 2014

На самом деле я считаю, что мы можем сделать довольно сильный вывод из спецификации W3C (http://www.w3.org/TR/html5/webappapis.html#timers). Это не гарантируется явно, но у нас есть много свидетельств того, что почти любая разумная реализация будет иметь такое поведение:

1) Тайм-ауты и интервалы фактически используют одну и ту же базовую функцию:

Метод setTimeout () должен возвращать значение, возвращаемое шагами инициализации таймера, передавая им аргументы метода ... и флаг повтора, установленный в false.

Метод setInterval () должен возвращать значение, возвращаемое таймером шаги инициализации, передавая им аргументы метода .... и флаг повтора установлен на true.

2) Эта единственная функция - упомянутые выше «шаги инициализации таймера» - использует один список таймеров:

2, ... let handle - это целое число, определенное пользовательским агентом, которое больше нуля который определит время ожидания, которое будет установлено этим вызовом в списке активные таймеры.

10, ручка возврата ...

3) clearTimeout () и clearInterval () оба работают с этим списком (и фактически не отличаются спецификацией в любом случае)

Методы clearTimeout () и clearInterval () должны очистить запись идентифицируется как дескриптор из списка активных таймеров Объект WindowTimers, для которого был вызван метод, где handle аргумент передается методу, если таковой имеется. (Если ручка не идентифицировать запись в списке активных таймеров WindowTimers объект, для которого был вызван метод, метод ничего не делает.)

Я полагаю, что это довольно убедительный случай, когда clearTimeout и clearInterval должны быть синонимами в соответствии со спецификацией. Это подтверждается тем фактом, что это работает во всех протестированных мной браузерах (Chrome 37, Firefox 33 и Opera 25).

22 голосов
/ 28 марта 2012

Нет, они не являются взаимозаменяемыми.

Конечно, некоторые браузеры могут использовать один и тот же код для одинаковой очистки интервалов и тайм-аутов, но это не означает, что они взаимозаменяемы иВы наверняка не гарантированы, что они будут работать одинаково во всех реализациях браузера.Это сводится к тому, что эти два метода определяются по-разному для разных целей, и поэтому вы должны использовать их для их назначенного использования. В противном случае вы просто напрашиваетесь на неприятности.

12 голосов
/ 03 марта 2017

Из ссылки Mozilla :

Стоит отметить, что пул идентификаторов, используемых setTimeout () и setInterval (), является общим, что означает, что вы можете технически использовать clearTimeout() и clearInterval () взаимозаменяемо.Однако, для ясности, вам следует избегать этого.

0 голосов
/ 28 марта 2012

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

...