Internet explorer частота таймера javascript что это

Обновлено: 05.07.2024

Мы можем вызвать функцию не в данный момент, а позже, через заданный интервал времени. Это называется «планирование вызова».

Для этого существуют два метода:

  • setTimeout позволяет вызвать функцию один раз через определённый интервал времени.
  • setInterval позволяет вызывать функцию регулярно, повторяя вызов через определённый интервал времени.

Эти методы не являются частью спецификации JavaScript. Но большинство сред выполнения JS-кода имеют внутренний планировщик и предоставляют доступ к этим методам. В частности, они поддерживаются во всех браузерах и Node.js.

setTimeout

func|code Функция или строка кода для выполнения. Обычно это функция. По историческим причинам можно передать и строку кода, но это не рекомендуется. delay Задержка перед запуском в миллисекундах (1000 мс = 1 с). Значение по умолчанию – 0. arg1 , arg2 … Аргументы, передаваемые в функцию (не поддерживается в IE9-)

Например, данный код вызывает sayHi() спустя одну секунду:

Если первый аргумент является строкой, то JavaScript создаст из неё функцию.

Это также будет работать:

Но использование строк не рекомендуется. Вместо этого используйте функции. Например, так:

Начинающие разработчики иногда ошибаются, добавляя скобки () после функции:

Это не работает, потому что setTimeout ожидает ссылку на функцию. Здесь sayHi() запускает выполнение функции, и результат выполнения отправляется в setTimeout . В нашем случае результатом выполнения sayHi() является undefined (так как функция ничего не возвращает), поэтому ничего не планируется.

Отмена через clearTimeout

Вызов setTimeout возвращает «идентификатор таймера» timerId , который можно использовать для отмены дальнейшего выполнения.

Синтаксис для отмены:

В коде ниже планируем вызов функции и затем отменяем его (просто передумали). В результате ничего не происходит:

Как мы видим из вывода alert , в браузере идентификатором таймера является число. В других средах это может быть что-то ещё. Например, Node.js возвращает объект таймера с дополнительными методами.

Повторюсь, что нет единой спецификации на эти методы, поэтому такое поведение является нормальным.

Для браузеров таймеры описаны в разделе таймеров стандарта HTML5.

setInterval

Метод setInterval имеет такой же синтаксис как setTimeout :

Все аргументы имеют такое же значение. Но отличие этого метода от setTimeout в том, что функция запускается не один раз, а периодически через указанный интервал времени.

Чтобы остановить дальнейшее выполнение функции, необходимо вызвать clearInterval(timerId) .

В большинстве браузеров, включая Chrome и Firefox, внутренний счётчик продолжает тикать во время показа alert/confirm/prompt .

Рекурсивный setTimeout

Есть два способа запускать что-то регулярно.

Один из них setInterval . Другим является рекурсивный setTimeout . Например:

Метод setTimeout выше планирует следующий вызов прямо после окончания текущего (*) .

Рекурсивный setTimeout – более гибкий метод, чем setInterval . С его помощью последующий вызов может быть задан по-разному в зависимости от результатов предыдущего.

Например, необходимо написать сервис, который отправляет запрос для получения данных на сервер каждые 5 секунд, но если сервер перегружен, то необходимо увеличить интервал запросов до 10, 20, 40 секунд… Вот псевдокод:

А если функции, которые мы планируем, ресурсоёмкие и требуют времени, то мы можем измерить время, затраченное на выполнение, и спланировать следующий вызов раньше или позже.

Рекурсивный setTimeout позволяет задать задержку между выполнениями более точно, чем setInterval .

Сравним два фрагмента кода. Первый использует setInterval :

Второй использует рекурсивный setTimeout :

Для setInterval внутренний планировщик будет выполнять func(i) каждые 100 мс:

Реальная задержка между вызовами func с помощью setInterval меньше, чем указано в коде!

Это нормально, потому что время, затраченное на выполнение func , использует часть заданного интервала времени.

Вполне возможно, что выполнение func будет дольше, чем мы ожидали, и займёт более 100 мс.

В данном случае движок ждёт окончания выполнения func и затем проверяет планировщик и, если время истекло, немедленно запускает его снова.

В крайнем случае, если функция всегда выполняется дольше, чем задержка delay , то вызовы будут выполняться без задержек вообще.

Ниже представлено изображение, показывающее процесс работы рекурсивного setTimeout :

Рекурсивный setTimeout гарантирует фиксированную задержку (здесь 100 мс).

Это потому, что новый вызов планируется в конце предыдущего.

Когда функция передаётся в setInterval/setTimeout , на неё создаётся внутренняя ссылка и сохраняется в планировщике. Это предотвращает попадание функции в сборщик мусора, даже если на неё нет других ссылок.

Для setInterval функция остаётся в памяти до тех пор, пока не будет вызван clearInterval .

Есть и побочный эффект. Функция ссылается на внешнее лексическое окружение, поэтому пока она существует, внешние переменные существуют тоже. Они могут занимать больше памяти, чем сама функция. Поэтому, если регулярный вызов функции больше не нужен, то лучше отменить его, даже если функция очень маленькая.

setTimeout с нулевой задержкой

Особый вариант использования: setTimeout(func, 0) или просто setTimeout(func) .

Это планирует вызов func настолько быстро, насколько это возможно. Но планировщик будет вызывать функцию только после завершения выполнения текущего кода.

Так вызов функции будет запланирован сразу после выполнения текущего кода.

Например, этот код выводит «Привет» и затем сразу «Мир»:

Первая строка помещает вызов в «календарь» через 0 мс. Но планировщик проверит «календарь» только после того, как текущий код завершится. Поэтому "Привет" выводится первым, а "Мир" – после него.

Есть и более продвинутые случаи использования нулевой задержки в браузерах, которые мы рассмотрим в главе Событийный цикл: микрозадачи и макрозадачи.

Минимальная задержка вложенных таймеров в браузере

В браузере есть ограничение на то, как часто внутренние счётчики могут выполняться. В стандарте HTML5 говорится: «после пяти вложенных таймеров интервал должен составлять не менее четырёх миллисекунд.».

Продемонстрируем в примере ниже, что это означает. Вызов setTimeout повторно вызывает себя через 0 мс. Каждый вызов запоминает реальное время от предыдущего вызова в массиве times . Какова реальная задержка? Посмотрим:

Первый таймер запускается сразу (как и указано в спецификации), а затем задержка вступает в игру, и мы видим 9, 15, 20, 24. .

Аналогичное происходит при использовании setInterval вместо setTimeout : setInterval(f) запускает f несколько раз с нулевой задержкой, а затем с задержкой 4+ мс.

Это ограничение существует давно, многие скрипты полагаются на него, поэтому оно сохраняется по историческим причинам.

Этого ограничения нет в серверном JavaScript. Там есть и другие способы планирования асинхронных задач. Например, setImmediate для Node.js. Так что это ограничение относится только к браузерам.

Итого

  • Методы setInterval(func, delay, . args) и setTimeout(func, delay, . args) позволяют выполнять func регулярно или только один раз после задержки delay , заданной в мс.
  • Для отмены выполнения необходимо вызвать clearInterval/clearTimeout со значением, которое возвращают методы setInterval/setTimeout .
  • Вложенный вызов setTimeout является более гибкой альтернативой setInterval . Также он позволяет более точно задать интервал между выполнениями.
  • Планирование с нулевой задержкой setTimeout(func,0) или, что то же самое, setTimeout(func) используется для вызовов, которые должны быть исполнены как можно скорее, после завершения исполнения текущего кода.
  • Браузер ограничивает 4-мя мс минимальную задержку между пятью и более вложенными вызовами setTimeout , а также для setInterval , начиная с 5-го вызова.

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

Например, таймер в браузере может замедляться по многим причинам:

  • Перегружен процессор.
  • Вкладка браузера в фоновом режиме.
  • Работа ноутбука от аккумулятора.

Всё это может увеличивать минимальный интервал срабатывания таймера (и минимальную задержку) до 300 или даже 1000 мс в зависимости от браузера и настроек производительности ОС.

Задачи

Вывод каждую секунду

Напишите функцию printNumbers(from, to) , которая выводит число каждую секунду, начиная от from и заканчивая to .


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

Internet Explorer 9 получил от создателей новый движок JavaScript, а Вы – возможность отрегулировать баланс между его производительностью и энергосбережением. После установки браузера в управлении электропитанием Windows появляется новая настройка:

Здесь Вы можете задать поведение при питании от батареи и от сети. Значения у параметров совсем нехитрые: Максимальная производительность и Максимальное энергосбережение.

* по умолчанию настройка имеет различные значения в зависимости от выбранного плана.

*

Осталось разобраться, что изменение параметра даёт на практике. Для этого нужно раздобыть ноутбук и протестировать.

Выбираю план питания Сбалансированный и выставляю несколько параметров:

  • запрет на сон
  • запрет на гибридный спящий режим
  • запрет на отключение экрана
  • переход в гибернацию при 50% заряда батареи (больше ждать смысла нет). Переход в гибернацию нужен, чтобы обойтись без секундомера. Гораздо удобнее определить время включения по событию 100 и время перехода в гибернацию по событию 300, к тому же этот способ точнее.

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

Чтобы нагрузить JavaScript буду использовать 8 прогонов теста Peacekeeper, а затем машина будет бездействовать до ухода в гибернацию.

Тест повторяю для обоих параметров.

*

Как Вы видите, всего один параметр достаточно значительно влияет на производительность и энергосбережение.

Рекомендации можно дать такие:

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

Вас также может заинтересовать:

Подпишитесь на канал и читайте интересные записи чаще! Есть вопросы? Задайте их в чате.

комментариев 9

Большое спасибо! Я преподаватель, у меня нет денег на приобретение легальных программ и по этому у меня к вам просьба, если можно, то разъясняйте пожалуйста, как можно стредствами самой ОС-7 добиться хорошого результата, а может даже лучшего.Я вас благодарю за то, что вы уже сделали, я теперь часто захожу на ваш ОЗОН. До свиданья!

Ваша оценка: 0

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

Ваша оценка: 0

У меня нуоут HP 4720s, настройки элекропитания выставлены (HP-Recommended) практически то, что и Сбалансированный, Так что визуально разницы в работе от источника и без особо не заметно.
Вопрос у меня такой: -Вот в IE 9 имеется что-то speeddial. Кол-во рядов можно увеличить, а вот колонок я таково не нашёл. Можно?
И почему это задействовано в реестре?

Ваша оценка: 0 Ваша оценка: 0 Ваша оценка: 0

Вам Microsoft деньги хоть платит за доп. раскрутку браузера?-Вы работаете там?
Или Вы делаете просто так.

Ваша оценка: -3

Нам что, нельзя рассказывать об IE только потому, что упоминание о нем вызывает у вас тошноту? Если вы знаете интересные и уникальные возможности других браузеров, расскажите о них на таком же техническом и языковом уровне, и я с удовольствием размещу ваш рассказ в своем блоге. Слабо?

P.S. Нет, MSFT мне не платит, и я там не работаю. Я публикую такие статьи специально для таких как вы, которые не видят дальше собственного носа, то бишь браузера :)

P.P.S. Вас, кстати, не смущает, что подавляющее большинство записей блога посвящено ОС Microsoft. И, кстати, если вы пользуетесь Windows, вас это не напрягает случайно? ;)

Годится! Согласны? +5

В Thinkpad есть собственный менеджер питания. Подскажите есть ли смысл отказать от него в пользу стандартных средств W7? Или задам вопрос по другому, достаточно ли управления питанием от W7 для обычных пользователей? Мне просто не нравятся дополнительные надстройки к ОС, если ее средства справляются с поставленными задачами.

Ваша оценка: 0

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

Как настроить ноутбук

1. Настройка электропитания

Нажимаем снизу справа на значок розетки и батареи ПКМ и выбираем ЭЛЕКТРОПИТАНИЕ. Далее настройка схемы электропитания, далее ИЗМЕНИТЬ ДОП. ПАРАМЕТРЫ ПИТАНИЯ.

Требовать введения пароля при пробуждении.

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

Отключать жесткий диск через.

Нужно для того, чтобы ЖД при простое (когда вы или система не делает никакой запрос к ЖД, например) отключался, чтобы снизить энергопотребление. Например когда я не смотрю никакой фильм или не слушаю музыку или лазаю по папкам на своем внешнем ЖД, он через 20 мин. отключается.

Частота таймера javascript

Нужна для частоты исполнения функции в ява скрипте. Чем чаще частота, тем правильнее и плавнее исполняется функция, но также высокая частота может нагружать процессор, а порой даже невероятно сильно нагружать. Например такую проблему можно видеть во флеш роликах кот. переформатированы в .exe файлы. Или когда открыто много документов соц. сети.

Можно оставить как есть, от батареи МАКС. ЭНЕРГОСБЕР, от сети МАКС ПРОИЗВОД.

Показ слайдов

Нужно для того, чтобы если на раб. столе у вас устан. сменять картинку каждые 30 минут например на другую, то при работе от батареи остановив это можно немножко сэкономить заряд. А при работе от сети на счет этого можно не беспокоится.

Параметры адаптера беспроводной сети

Нужно для снижения напряжения на адаптер при простое, т.е. когда вы не используете сеть, то в неё поступает меньше электроэнергии. Для максимальной скорости доступной в вашей сети ставьте МАКС ПРОИЗВОДИТЕЛЬНОСТЬ, если же вы смотрите HD онлайн, то можно поставить и СРЕДНЕЕ ЭНЕРГОСБЕРЕЖЕНИЕ, особенно при работе от батареи, либо МАКС. ЭНЕРГОСБЕРЕЖЕНИЕ.

СОН

В режиме сна комп переход в режим пониженного энергопотребления и при его пробуждении все документы открытые вами остаются открытыми в оперативной памяти. В этом режиме компьютер максимально быстро будет готов к работе, когда он вам понадобится. Но для поддержания этого режима требуется немного электроэнергии.

Гибридный спящий режим

Гибернация после

Режим гибернации сохраняет все открытые программы и файлы вами на ЖД и восстанавливает их при пробуждении компа с ЖД. Пробуждение происходит дольше, чем при режиме СНА, но зато в режиме гибернации компу не требуется электроэнергии и никакой сбой в подаче электроэнергии компу не страшен.

Разрешать таймеры пробуждения

Нужен для того, чтобы возвращать к работе ваш комп, при определенных запланированных событиях. Например проверке на вирусы или сетевая карта дала команду на подключение к инету. В общем чтобы ваш комп самопроизвольно не включался выберите ОТКЛЮЧИТЬ.

Параметры USB

Любое подключенное USB устройство потребляет энергию для работы, чтобы постоянно оно не тратила электропитание ноута включите его временное отключение при простое выбрав РАЗРЕШЕНО.

Действие при закрытии крышки

Когда вы опускаете крышку ноутбука, то можно чтобы ноут переходил в 1 из режимов энергопотребления. Например СОН, ГИБЕРНАЦИЯ (про них я уже рассказал ранее), ЗАВЕРШЕНИЕ РАБОТЫ или можно выбрать чтобы ничего не происходило, помимо отключения монитора.

Действие кнопки питания

Сверху слева или сверху справа на вашем ноуте есть кнопка его включения при выключенном состоянии. Так вот здесь её можно настроить на действие при включенном ноуте. Например Например СОН, ГИБЕРНАЦИЯ (про них я уже рассказал ранее), ЗАВЕРШЕНИЕ РАБОТЫ.

Действие кнопки спящего режима

Кнопка спящего режима бывает отдельно на ноутбуке, либо работает только при сочетании каких-либо клавиш. Либо при зажатой кнопке FN (про кнопку FN и её, функции смотрите в моем из моих предыдущих роликах). Например у меня кнопка кнопка спящего режима на FN + ESCAPE. Ну так вот здесь можно настроить её действие при нажатии кнопки СНА, ноут может уходит в режим СНА или ГИБЕРНАЦИИ.

PCI Express

Позволяет задать энергосбережение для устройств PCI Express за счет производительности.

Управление питанием процессора

Минимальное состояние процессора

Позволяет задать нижний предел производительности, т.е. во время того, когда никакие вычисления и просмотр фильма и прослушивание музыки не происходят, то состояние энергопотребления процессора понижается до 5% у меня

Политика охлаждения системы

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

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

Максимальное состояние процессора

Для высокой производительности процессора и макс энергопотребления процессора укажите 100%, для пониженной производительности процессора и макс сбережения энергии укажите например 80% или 60%. При работе от сети ставьте 100%. При работе от батареи поставьте 80%.

Экран

Гашение экрана это снижение его яркости для пониженного энергопотребления. От сети поставьте 5 или 10 минут, от батареи 2 или 5.

Отключать экран

Означает полное его отключение.

Поставьте от батареи 5-10 минут. От сети 10-15 минут.

Яркость экрана

Означает насколько ярко монитор будет работать (тоже что и яркость в телефоне). От батареи поставьте 50%, от сети 100%.

Уровень яркости в режиме пониженной яркости

Позволяет задать используемый по умолчанию уровень яркости экрана при переходе в режим уменьшенной яркости.

Поставьте от батареи 50%, от сети 80%.

Включить адаптивную регулировку яркости

Включает датчик освещенности помещения. Работает так: если в комнате ярко то монитор увеличит яркость, если тускло, то монитор уменьшит яркость. Работает также как на iPhone Автояркость.

Параметры мультимедиа

В режиме отсутствия компьютер продолжает выполнение таких задач, как запись запланированных телепрограмм или обмен видеоклипами и музыкальными файлами, но внешне выглядит так, как будет его питание отключено. При этом Монитор отключен. Звук отключен.

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

Если через ваш компьютер другие пользователи подключаясь к нему дистанционно слушают музыку или смотрят видео то ставьте от батареи РАЗРЕШИТЬ КОМПУ ПЕРЕХОДИТЬ В РЕЖИМ ОТСУТСТВИЯ. А от сети ЗАПРЕТИТЬ ПЕРЕХОД ИЗ СОСТОЯНИЯ ПРОСТОЯ В СПЯЩИЙ РЕЖИМ.

Если же вы используете комп только для себя, то ставьте от батареи и от сети РАЗРЕШИТЬ КОМПУ ПЕРЕХОДИТЬ В СПЯЩИЙ РЕЖИМ.

При воспроизведении видео

Здесь можно установить снижение качества видео для меньшего энергопотребления. Данный параметр оптимизирует алгоритм воспроизведения видеоматериалов компьютером так, чтобы обеспечить либо максимально возможное качество воспроизведения, либо увеличение времени работы компьютера от батареи.

Если хотите чтобы от батареи работал ноут дольше ставьте ОПТИМИЗАЦИЯ ЭНЕРГОСБЕРЕЖЕНИЯ. А от сети ОПТИМИЗАЦИЯ КАЧЕСТВА ВИДЕО.

Батарея

Действие почти полной разрядки батарей

Здесь мы ставим действие кот. будет происходит при почти полной разрядки батареи ноута.

Итак вновь напомню:

В режиме сна комп переход в режим пониженного энергопотребления и при его пробуждении все документы открытые вами остаются открытыми в оперативной памяти. В этом режиме компьютер максимально быстро будет готов к работе, когда он вам понадобится. Но для поддержания этого режима требуется немного электроэнергии.

Режим гибернации сохраняет все открытые программы и файлы вами на ЖД и восстанавливает их при пробуждении компа с ЖД. Пробуждение происходит дольше, чем при режиме СНА, но зато в режиме гибернации компу не требуется электроэнергии и никакой сбой в подаче электроэнергии компу не страшен.

Гибридный спящий режим

Советую ставить от батареи ГИБЕРНАЦИЯ, а от сети ДЕЙСТВИЕ НЕ ТРЕБУЕТСЯ.

Уровень низкого заряда батареи

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

Советую задать тут 10%

Уровень почти полной разрядки батареи

Позволяет указать, какой уровень заряда батареи следует считать уровнем почти полной разрядки.

Советую задать тут 5%

Уведомление о низком заряде батареи

Действия низкого заряда батареи

Позволяет задать, что должно произойти, когда заряд батареи опустится до низкого уровня.

Можете выбрать Действие не требуется.

Уровень резервной батареи

Советую ставить 8%.

Вот видео урок на тему настройки ноутбука.

setTimeout и setInterval

Почти все реализации JavaScript имеют внутренний таймер-планировщик, который позволяет задавать вызов функции через заданный период времени.

В частности, эта возможность поддерживается в браузерах и в сервере Node.JS.

func/code : Функция или строка кода для исполнения. Строка поддерживается для совместимости, использовать её не рекомендуется.

delay : Задержка в миллисекундах, 1000 миллисекунд равны 1 секунде.

arg1 , arg2 . : Аргументы, которые нужно передать функции. Не поддерживаются в IE9-.

Исполнение функции произойдёт спустя время, указанное в параметре delay .

Например, следующий код вызовет func() через одну секунду:

С передачей аргументов (не сработает в IE9-):

Если первый аргумент является строкой, то интерпретатор создаёт анонимную функцию из этой строки.

То есть такая запись тоже сработает:

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

Вместо них используйте анонимные функции, вот так:

Отмена исполнения clearTimeout

Функция setTimeout возвращает числовой идентификатор таймера timerId , который можно использовать для отмены действия.

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

Как видно из alert , в браузере идентификатор таймера является обычным числом. Другие JavaScript-окружения, например Node.JS, могут возвращать объект таймера, с дополнительными методами.

Такие разночтения вполне соответствуют стандарту просто потому, что в спецификации JavaScript про таймеры нет ни слова.

Таймеры -- это надстройка над JavaScript, которая описана в секции Timers стандарта HTML5 для браузеров и в документации к Node.JS -- для сервера.

Метод setInterval имеет синтаксис, аналогичный setTimeout .

Смысл аргументов -- тот же самый. Но, в отличие от setTimeout , он запускает выполнение функции не один раз, а регулярно повторяет её через указанный интервал времени. Остановить исполнение можно вызовом clearInterval(timerId) .

Важная альтернатива setInterval -- рекурсивный setTimeout :

В коде выше следующее выполнение планируется сразу после окончания предыдущего.

Рекурсивный setTimeout -- более гибкий метод тайминга, чем setInterval , так как время до следующего выполнения можно запланировать по-разному, в зависимости от результатов текущего.

Например, у нас есть сервис, который раз в 5 секунд опрашивает сервер на предмет новых данных. В случае, если сервер перегружен, можно увеличивать интервал опроса до 10, 20, 60 секунд. А потом вернуть обратно, когда всё нормализуется.

Если у нас регулярно проходят грузящие процессор задачи, то мы можем оценивать время, потраченное на их выполнение, и планировать следующий запуск раньше или позже.

Рекурсивный setTimeout гарантирует паузу между вызовами, setInterval -- нет.

Давайте сравним два кода. Первый использует setInterval :

Второй использует рекурсивный setTimeout :

При setInterval внутренний таймер будет срабатывать чётко каждые 100 мс и вызывать func(i) :


Вы обратили внимание.

Реальная пауза между вызовами func при setInterval меньше, чем указана в коде!

Это естественно, ведь время работы функции никак не учитывается, оно "съедает" часть интервала.

Возможно и такое что func оказалась сложнее, чем мы рассчитывали и выполнялась дольше, чем 100 мс.

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

Если функция и выполняется дольше, чем пауза setInterval , то вызовы будут происходить вообще без перерыва.

Исключением является IE, в котором таймер "застывает" во время выполнения JavaScript.

А так будет выглядеть картинка с рекурсивным setTimeout :


При рекурсивном setTimeout задержка всегда фиксирована и равна 100 мс.

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

Минимальная задержка таймера

У браузерного таймера есть минимальная возможная задержка. Она меняется от примерно нуля до 4 мс в современных браузерах. В более старых она может быть больше и достигать 15 мс.

По стандарту, минимальная задержка составляет 4 мс. Так что нет разницы между setTimeout(. 1) и setTimeout(. 4) .

Посмотреть минимальное разрешение "вживую" можно на следующем примере.

В примере ниже каждая полоска удлиняется вызовом setInterval с указанной на ней задержкой -- от 0 мс (сверху) до 20 мс (внизу).

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

[iframe border="1" src="https://github.com/iliakan/javascript-tutorial-ru/blob/master/1-js/7-js-misc/3-settimeout-setinterval/setinterval-anim" link edit]

Реальная частота срабатывания

В ряде ситуаций таймер будет срабатывать реже, чем обычно. Задержка между вызовами setInterval(. 4) может быть не 4 мс, а 30 мс или даже 1000 мс.

Большинство браузеров (десктопных в первую очередь) продолжают выполнять setTimeout/setInterval , даже если вкладка неактивна.

При этом ряд из них (Chrome, FF, IE10) снижают минимальную частоту таймера, до 1 раза в секунду. Получается, что в "фоновой" вкладке будет срабатывать таймер, но редко.

При работе от батареи, в ноутбуке -- браузеры тоже могут снижать частоту, чтобы реже выполнять код и экономить заряд батареи. Особенно этим известен IE. Снижение может достигать нескольких раз, в зависимости от настроек.

При слишком большой загрузке процессора JavaScript может не успевать обрабатывать таймеры вовремя. При этом некоторые запуски setInterval будут пропущены.

Вывод: на частоту 4 мс стоит ориентироваться, но не стоит рассчитывать.

Разбивка долгих скриптов

Нулевой или небольшой таймаут также используют, чтобы разорвать поток выполнения "тяжелых" скриптов.

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

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

Например, осуществляется анализ и подсветка первых 100 строк, затем через 20 мс -- следующие 100 строк и так далее. При этом можно подстраиваться под CPU посетителя: замерять время на анализ 100 строк и, если процессор хороший, то в следующий раз обработать 200 строк, а если плохой -- то 50. В итоге подсветка будет работать с адекватной быстротой и без тормозов на любых текстах и компьютерах.

  • Методы setInterval(func, delay) и setTimeout(func, delay) позволяют запускать func регулярно/один раз через delay миллисекунд.
  • Оба метода возвращают идентификатор таймера. Его используют для остановки выполнения вызовом clearInterval/clearTimeout .
  • В случаях, когда нужно гарантировать задержку между регулярными вызовами или гибко её менять, вместо setInterval используют рекурсивный setTimeout .
  • Минимальная задержка по стандарту составляет 4 мс . Браузеры соблюдают этот стандарт, но некоторые другие среды для выполнения JS, например Node.JS, могут предоставить и меньше задержки.
  • В реальности срабатывания таймера могут быть гораздо реже, чем назначено, например если процессор перегружен, вкладка находится в фоновом режиме, ноутбук работает от батареи или по какой-то иной причине.

Браузерных особенностей почти нет, разве что вызов setInterval(. 0) с нулевой задержкой в IE недопустим, нужно указывать setInterval(. 1) .

Читайте также: