setInterval / setTimeout возвращаемое значение - PullRequest
38 голосов
/ 02 июня 2009

Два вопроса:

  1. Как вычисляется значение, возвращаемое из setInterval и setTimeout (используемых для сброса таймеров)?

  2. Возможно ли, чтобы обе функции возвращали одно и то же значение во время выполнения? Например:

    var a = setInterval(fn1, 1000);
    var b = setTimeout(fn2, 1000);

Возможно ли для a и b иметь одинаковое значение?

Первый вопрос скорее для моего знания, но второй важнее.

Ответы [ 6 ]

34 голосов
/ 02 июня 2009

Возвращает значение, которое можно использовать для отмены таймера. Таким образом, маловероятно, что они возвращают одно и то же значение (если только они не используют значения повторно и один из таймеров уже был отменен)

Mozilla заявляет, что это уровень DOM 0, но не является частью спецификации. (посмотрите внизу страницы)

У меня есть еще лучший справочник:

Набл говорит:

SetTimeout и setInterval из оригинальная спецификация Javascript, предварительно ECMA. Эта спецификация не официально стандартизирован везде, но поддерживается всеми веб-браузерами и большинство реализаций Язык JavaScript (В том числе ActionScript.)

Спецификации до ECMA часто известны как API-интерфейсы "ДОМ-0". Так как у них есть никогда не было стандартизировано раньше, это имеет смысл для HTML5, наконец, спецификации не осуждаемые API в попытке обеспечить согласованную среду через браузеры. Особенно когда Недавние события доказали, что там это компании, которые любят внедрять буква стандарта, но не дух.

Прочитайте оригинальную спецификацию здесь или от Sun (который был ранним сторонником JavaScript).

32 голосов
/ 02 июня 2009

Протестировано это в Opera 9, Safari 3, Firefox 3 и IE 7.

Все возвращаемые целочисленные значения, начиная с 1, а затем увеличиваясь на 1 для каждого вызова setTimeOut() и setInterval(). Однако я заметил, что браузеры запускают счетчики и обрабатывают их по-разному:

  • IE начинал с (казалось бы) случайного 6-значного числа, но последующие вызовы любой функции увеличивали это число. После закрытия и повторного открытия IE я обнаружил, что начальное число, по-видимому, генерируется случайным образом, так как оно было далеко от значения предыдущего сеанса.
  • Opera поддерживала счетчик для каждой вкладки - закрывая вкладку и открывая новую, счетчик начинался с 1 на новой вкладке.
  • В Safari счетчик был глобальным - открытие новой вкладки и вызов функций в разных вкладках, казалось, увеличивали глобальный счетчик ссылок.
  • В Firefox счетчик начинался с 2 и увеличивался при каждом последующем обращении к любой функции. Как и в Opera, каждая вкладка имела свое собственное значение счетчика, но все они начинаются с 2.

Обратите внимание, что во всех сценариях нет двух одинаковых идентификаторов (по крайней мере, на одной вкладке).

6 голосов
/ 02 июня 2009

Я думаю, что это не стандартизированное поведение. В Firefox это просто целое число, увеличивающееся при каждом вызове setTimeout или setInterval. И нет, они не могут иметь одинаковое значение.

2 голосов
/ 02 июня 2009

с сайта Mozilla:

intervalID - это уникальный идентификатор интервала, который вы можете передать clearInterval ().

Так что это уникально :) 1007 *

1 голос
/ 02 июня 2009

Могут ли они иметь одинаковое значение, зависит от реализации JavaScript. Как Maciej упомянул в Firefox, они не могут иметь то же значение, что и тот же счетчик. Однако в других браузерах это может отличаться, поэтому лучше не полагаться на то, что они никогда не будут иметь одинаковое значение.

0 голосов
/ 05 марта 2014

Мне кажется, что возвращаемое значение является индексом для любого внутреннего списка таймеров / интервалов, которые они хранят.

Как и в пункте, я вызвал clearInterval (18) вместо clearInterval (var_returned_from_set), и он остановил нужный таймер / интервал. (Проверено FF17.0.1 и IE9.0.8)

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

...