SetInterval/setTimeout возвращаемое значение
Два вопроса:
-
Как рассчитывается значение, возвращаемое из setInterval
и setTimeout
(те, которые использовались для очистки таймеров)?
-
Возможно ли, чтобы обе функции возвращали одно и то же значение во время выполнения?
Например:
var a = setInterval(fn1, 1000);
var b = setTimeout(fn2, 1000);
Возможно ли, чтобы a
и b
имели одинаковое значение?
Первый - это скорее вопрос для моего знания, но второй важнее.
Ответы
Ответ 1
Возвращает значение, которое можно использовать для отмены таймера. Таким образом, казалось бы маловероятным, чтобы они возвращали одинаковое значение (если только они не являются повторное использование значений и один из таймеров уже отменен)
Mozilla заявляет, что это уровень DOM 0, но не является частью спецификации. (посмотрите в нижней части страницы)
У меня есть еще лучшая ссылка:
Nabble говорит:
SetTimeout и setInterval - это оригинальная спецификация Javascript, предварительно ECMA. Эта спецификация не официально стандартизированы в любом месте, но он поддерживается всеми веб-браузерами и большинство реализаций Язык Javascript. (В том числе ActionScript.)
Спецификации до ECMA часто известны как API DOM-0. Поскольку они никогда раньше не был стандартизирован, он имеет смысл для HTML5 окончательно специфицировать неисключенные API в попытке обеспечить согласованную среду в браузерах. Особенно когда недавние события доказали, что это компании, которые хотели бы реализовать письмо стандарта, но не дух.
Прочитайте исходную спецификацию здесь или из Sun (кто был ранним разработчиком JavaScript).
Ответ 2
Протестировано в Opera 9, Safari 3, Firefox 3 и IE 7.
Все возвращаемые целочисленные значения, начиная с 1, а затем увеличивая на 1 для каждого вызова setTimeOut()
и setInterval()
. Однако я заметил, что браузеры запускали счетчики и обрабатывали их по-разному:
- IE начинался с (по-видимому) случайного 6-значного числа, но последующие вызовы любой функции увеличивали это число. После закрытия и повторного открытия IE я обнаружил, что начальный номер, по-видимому, был генерирован случайным образом, так как он не был рядом с подсчетом от предыдущего сеанса.
- Opera поддерживает счетчик для каждой вкладки - закрытие вкладки и открытие нового запускает счетчик с 1 на новой вкладке.
- В Safari счетчик был глобальным - открытие новой вкладки и вызов функций на разных вкладках, казалось, увеличил глобальный счетчик ссылок.
- В Firefox счетчик, казалось, начинался с 2 и увеличивался при каждом последующем вызове любой функции. Как и Opera, каждая вкладка имела собственное значение счетчика, но, похоже, все они начинались с 2.
Обратите внимание, что во всех сценариях два идентификатора (по крайней мере, на одной вкладке) не совпадают.
Ответ 3
Я думаю, что это не стандартизированное поведение. В firefox - простое целое число, увеличивающееся при каждом вызове setTimeout
или setInterval
. И, нет, они не могут иметь одинаковую ценность.
Ответ 4
На веб-сайте Mozilla:
intervalID - уникальный идентификатор интервала, который вы можете передать clearInterval().
Поэтому он уникален:)
Ответ 5
Могут ли они иметь одинаковое значение, зависит от реализации JavaScript. Как упоминал Maciej в Firefox, они не могут иметь то же значение, что и один и тот же счетчик. Однако это может быть другим в других браузерах, поэтому, возможно, лучше не полагаться на то, что они никогда не имеют одинакового значения.
Ответ 6
Мне кажется, что возвращаемое значение является значением индекса для любого внутреннего списка таймеров/интервалов, которые они хранят.
Как и в пункте, я вызвал clearInterval (18) вместо clearInterval (var_returned_from_set) и остановил нужный таймер/интервал. (Протестировано FF17.0.1 и IE9.0.8)
Также в моем собственном тестировании они кажутся уникальными для срока службы страницы для обоих этих браузеров.