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)

Также в моем собственном тестировании они кажутся уникальными для срока службы страницы для обоих этих браузеров.