частота таймера javascript что это
Таймеры JavaScript: все что нужно знать
Здравствуйте, коллеги. Давным-давно на Хабре уже переводилась статья под авторством Джона Резига как раз на эту тему. Прошло уж 10 лет, а тема по-прежнему требует разъяснений. Поэтому предлагаем интересующимся почитать статью Самера Буны, в которой дается не только теоретический обзор таймеров в JavaScript (в контексте Node.js), но и задачи на них.
Несколько недель назад я опубликовал в Твиттере следующий вопрос с одного собеседования:
«Где находится исходный код функций setTimeout и setInterval? Где бы вы его искали? Погуглить нельзя :)»
***Ответьте на него для себя, а потом читайте дальше ***
Кому-то может показаться, что это просто плохой вопрос с собеседования – какой вообще прок знать подобное?! Я, как JavaScript-разработчик, думаю так: предполагается, что вы должны это знать, поскольку обратное может свидетельствовать, что вы не вполне понимаете, как V8 (и другие виртуальные машины) взаимодействует с браузерами и Node.
Рассмотрим несколько примеров и решим парочку задач на таймеры, давайте?
Для запуска примеров из этой статьи можно воспользоваться командой node. Большинство рассмотренных здесь примеров фигурируют в моем курсе Getting Started with Node.js на Pluralsight.
Отложенное выполнение функции
Таймеры – это функции высшего порядка, при помощи которых можно откладывать или повторять выполнение других функций (таймер получает такую функцию в качестве первого аргумента).
Вот пример отложенного выполнения:
В этом примере при помощи setTimeout вывод приветственного сообщения откладывается на 4 секунды. Второй аргумент setTimeout — это задержка (в мс). Я умножаю 4 на 1000, чтобы получилось 4 секунды.
Первый аргумент setTimeout – функция, выполнение которой будет откладываться.
Если выполнить файл example1.js командой node, Node приостановится на 4 секунды, а затем выведет приветственное сообщение (после чего последует выход).
При выполнении example2.js командой node фраза “Node.js rocks” будет выведена на экран через 2 секунды.
Задача на таймеры #1
В вашем решении можно определить всего одну функцию, содержащую встроенные функции. Это означает, что множество вызовов setTimeout должны будут использовать одну и ту же функцию.
Вот как я бы решил эту задачу:
У меня theOneFunc получает аргумент delay и использует значение данного аргумента delay в сообщении, выводимом на экран. Таким образом, функция может выводить разные сообщения в зависимости от того, какое значение задержки мы ей сообщим.
Выполнив файл solution1.js командой node, мы выведем на экран требования задачи, причем, первое сообщение появится через 4 секунды, а второе — через 8 секунд.
Повторяем выполнение функции
Вот пример setInterval :
Поскольку при вызове функции таймера назначается действие, это действие также можно отменить, прежде, чем он будет выполнен.
Функция setImmediate поддерживается не во всех браузерах. Не используйте ее в клиентском коде.
Задержка таймера – вещь не гарантированная
Вы заметили, что в предыдущем примере при выполнении операции с setTimeout после 0 мс эта операция происходит не сразу же (после setTimeout ), а только после того, как будет целиком выполнен весь код скрипта (в том числе, вызов clearTimeout )?
Разумеется, на практике так делать очень плохо, но данный пример помогает понять, что задержка setTimeout – это не гарантированное, а, скорее, минимальное значение. Величина 500 мс означает, что задержка продлится минимум 500 мс. На самом деле, скрипту потребуется гораздо больше времени для вывода приветственной строки на экран. Сначала ему придется дождаться, пока завершится блокирующий цикл.
Задача на таймеры #2
Напишите скрипт, который будет выводить сообщение “Hello World” раз в секунду, но всего 5 раз. После 5 итераций скрипт должен вывести сообщение “Done”, после чего процесс Node завершится.
Подсказка: нужен счетчик.
Вот как я бы решил эту задачу:
«Кто» именно вызывает отложенные функции?
При использовании ключевого слова JavaScript this внутри обычной функции, вот так например:
Давайте определим функцию как свойство объекта, чтобы стало немного понятнее:
Теперь, когда при работе с функцией obj.whoCallMe мы будем напрямую использовать ссылку на нее, в качестве вызывающей стороны будет выступать объект obj (идентифицируемый по своему id ):
Кто в данном случае вызывающий?
Ответ будет отличаться в зависимости от того, где выполняется функция таймера. В данном случае просто недопустима зависимость от того, кто — вызывающая сторона. Вы утратите контроль над вызывающей стороной, поскольку именно от реализации таймера будет зависеть, кто в данном случае вызывает вашу функцию. Если протестировать этот код в Node REPL, то вызывающей стороной окажется объект Timeout :
Обратите внимание: это важно лишь в случае, когда ключевое слово JavaScript this используется внутри обычных функций. При использовании стрелочных функций вызывающая сторона вас вообще не должна беспокоить.
Задача на таймеры #3
Напишите скрипт, который будет непрерывно выводить сообщение “Hello World” с варьирующимися задержками. Начните с односекундной задержки, после чего на каждой итерации увеличивайте ее на секунду. На второй итерации задержка будет 2 секунды. На третьей — три, и так далее.
Включите задержку в выводимое сообщение. У вас должен получиться примерно такой вывод:
Hello World. 1
Hello World. 2
Hello World. 3
.
Ограничения: переменные можно определять только при помощи const. При помощи let или var — нельзя.
Поскольку длительность задержки в данной задаче – величина переменная, использовать setInterval здесь нельзя, но можно вручную настроить интервальное выполнение при помощи setTimeout внутри рекурсивного вызова. Первая выполненная функция с setTimeout будет создавать следующий таймер, и так далее.
Вот как можно было бы решить эту задачу:
Задача на таймеры #4
Напишите скрипт, который будет выводить сообщение “Hello World” с такой же структурой задержек, как и в задаче #3, но на этот раз группами по 5 сообщений, а в группах будет основной интервал задержки. Для первой группы из 5 сообщений выбираем исходную задержку в 100 мс, для следующей – 200 мс, для третьей – 300 мс и так далее.
Вот как должен работать этот скрипт:
Включите задержку в выводимое сообщение. У вас должен получиться примерно такой вывод (без комментариев):
Hello World. 100 // При 100 мс
Hello World. 100 // При 200 мс
Hello World. 100 // При 300 мс
Hello World. 100 // При 400 мс
Hello World. 100 // При 500 мс
Hello World. 200 // При 700 мс
Hello World. 200 // При 900 мс
Hello World. 200 // При 1100 мс
.
Вадим Стеркин
Представляю материал моего коллеги MVP, лидера форума Windows 7, где он известен как Morpheus. Читатели моего блога получили возможность раньше всех ознакомиться со статьей, которая будет опубликована на OSZone.net через несколько дней в рамках конкурса по IE9.
Чем больше различных элементов приходится обрабатывать движку браузера, тем интенсивнее потребляются ресурсы системы. Эта нагрузка повышает энергопотребление, что особенно актуально для владельцев ноутбуков. У них при высоком энергопотреблении сокращается время автономной работы от батареи.
Internet Explorer 9 получил от создателей новый движок JavaScript, а Вы – возможность отрегулировать баланс между его производительностью и энергосбережением. После установки браузера в управлении электропитанием Windows появляется новая настройка:
Пуск —> Панель управления —> Электропитание —> Настройка плана электропитания* —> Изменить дополнительные параметры питания —> Internet Explorer —>Частота таймера JavaScript
Здесь Вы можете задать поведение при питании от батареи и от сети. Значения у параметров совсем нехитрые: Максимальная производительность и Максимальное энергосбережение.
* по умолчанию настройка имеет различные значения в зависимости от выбранного плана.
Осталось разобраться, что изменение параметра даёт на практике. Для этого нужно раздобыть ноутбук и протестировать.
Выбираю план питания Сбалансированный и выставляю несколько параметров:
Выключаю ноутбук, полностью заряжаю батарею, отключаю зарядное устройство, включаю, тестирую.
Чтобы нагрузить JavaScript буду использовать 8 прогонов теста Peacekeeper, а затем машина будет бездействовать до ухода в гибернацию.
Тест повторяю для обоих параметров.
Как Вы видите, всего один параметр достаточно значительно влияет на производительность и энергосбережение.
Рекомендации можно дать такие:
Об авторе
Morpheus успешно скрывается от агента Смита в лабиринте форумов конференции OSZone.net. Там он ведет беспощадную борьбу со злобными машинами и неумелыми действиями их операторов 🙂
C мая 2012 г. Morpheus развивает свой блог Полезная площадь.
Вас также может заинтересовать:
Я в Telegram
Подпишитесь на канал и читайте интересные записи чаще! Есть вопросы? Задайте их в чате.
комментариев 9
Большое спасибо! Я преподаватель, у меня нет денег на приобретение легальных программ и по этому у меня к вам просьба, если можно, то разъясняйте пожалуйста, как можно стредствами самой ОС-7 добиться хорошого результата, а может даже лучшего.Я вас благодарю за то, что вы уже сделали, я теперь часто захожу на ваш ОЗОН. До свиданья!
Андрей, если честно, то я не уловил связь между отсутствием у вас денег на легальные программы и этой записью. В моем блоге нет записей, посвященных платным программам, но большинство из них о платной операционной системе.
Платить или не платить за нее, это ваше личное дело (хотя могли бы гордо использовать Линукс и не жаловаться на свою нищету тут). Но если вы не сможете воспользоваться каким-то из моих советов по причине кривизны вашей г-сборки, это будет следствием избранного вами пути 🙂
Андрей, вам нужно следить за конкурсными статьями по Internet Explorer 9 на OSZone.
Правильно, надо смотреть. А я по-гуглил и с вам поближе познакомился. Ещё раз спасибо. IE 7Pro — классно, только с англ. туговато, буду разбираться.
(bogok)
Вам Microsoft деньги хоть платит за доп. раскрутку браузера?-Вы работаете там?
Или Вы делаете просто так.
Дмитрий, а в чем вы видите раскрутку браузера? У браузера Microsoft новая интересная (и даже уникальная) возможность. Мой коллега о ней рассказал, я разместил его рассказ в блоге.
Нам что, нельзя рассказывать об IE только потому, что упоминание о нем вызывает у вас тошноту? Если вы знаете интересные и уникальные возможности других браузеров, расскажите о них на таком же техническом и языковом уровне, и я с удовольствием размещу ваш рассказ в своем блоге. Слабо?
P.S. Нет, MSFT мне не платит, и я там не работаю. Я публикую такие статьи специально для таких как вы, которые не видят дальше собственного носа, то бишь браузера 🙂
P.P.S. Вас, кстати, не смущает, что подавляющее большинство записей блога посвящено ОС Microsoft. И, кстати, если вы пользуетесь Windows, вас это не напрягает случайно? 😉
В Thinkpad есть собственный менеджер питания. Подскажите есть ли смысл отказать от него в пользу стандартных средств W7? Или задам вопрос по другому, достаточно ли управления питанием от W7 для обычных пользователей? Мне просто не нравятся дополнительные надстройки к ОС, если ее средства справляются с поставленными задачами.
Валерий, стандартные средства справляются, но инженеры IBM, наверное, видят какой-то смысл в собственных схемах, иначе бы они не тратили деньги на их создание.
Как настроить ноутбук
Опубликовано 13.01.2014 · Обновлено 29.08.2015
Покажу как надо настроить ноутбук. Расскажу о настройке электропитания, пароля, жесткого диска, сна, гибернации, энергосбережении, параметрах usb, pci-express, о настройке охлаждения, процессора, экрана, батареи…
1. Настройка электропитания
Нажимаем снизу справа на значок розетки и батареи ПКМ и выбираем ЭЛЕКТРОПИТАНИЕ. Далее настройка схемы электропитания, далее ИЗМЕНИТЬ ДОП. ПАРАМЕТРЫ ПИТАНИЯ.
Требовать введения пароля при пробуждении.
Нужно, чтобы если у вас стоит пароль на вход в компьютер, то он запрашивался при выходе из спящего или ждущего режима.
Отключать жесткий диск через.
Нужно для того, чтобы ЖД при простое (когда вы или система не делает никакой запрос к ЖД, например) отключался, чтобы снизить энергопотребление. Например когда я не смотрю никакой фильм или не слушаю музыку или лазаю по папкам на своем внешнем ЖД, он через 20 мин. отключается.
Частота таймера javascript
Можно оставить как есть, от батареи МАКС. ЭНЕРГОСБЕР, от сети МАКС ПРОИЗВОД.
Показ слайдов
Нужно для того, чтобы если на раб. столе у вас устан. сменять картинку каждые 30 минут например на другую, то при работе от батареи остановив это можно немножко сэкономить заряд. А при работе от сети на счет этого можно не беспокоится.
Параметры адаптера беспроводной сети
Нужно для снижения напряжения на адаптер при простое, т.е. когда вы не используете сеть, то в неё поступает меньше электроэнергии. Для максимальной скорости доступной в вашей сети ставьте МАКС ПРОИЗВОДИТЕЛЬНОСТЬ, если же вы смотрите HD онлайн, то можно поставить и СРЕДНЕЕ ЭНЕРГОСБЕРЕЖЕНИЕ, особенно при работе от батареи, либо МАКС. ЭНЕРГОСБЕРЕЖЕНИЕ.
В режиме сна комп переход в режим пониженного энергопотребления и при его пробуждении все документы открытые вами остаются открытыми в оперативной памяти. В этом режиме компьютер максимально быстро будет готов к работе, когда он вам понадобится. Но для поддержания этого режима требуется немного электроэнергии.
Гибридный спящий режим
В этом режиме открытые программы и документы сохраняются в памяти и на ЖД, а комп переходит в режим пониженного потребления электроэнергии. Если произойдёт непредвиденный сбой питания, Windows восстановит данные с жёсткого диска. На настольных компьютерах такой режим включен по умолчанию, поэтому, когда вы кликаете на «переход в спящий режим», активируется гибридный спящий режим.
Гибернация после
Режим гибернации сохраняет все открытые программы и файлы вами на ЖД и восстанавливает их при пробуждении компа с ЖД. Пробуждение происходит дольше, чем при режиме СНА, но зато в режиме гибернации компу не требуется электроэнергии и никакой сбой в подаче электроэнергии компу не страшен.
Разрешать таймеры пробуждения
Нужен для того, чтобы возвращать к работе ваш комп, при определенных запланированных событиях. Например проверке на вирусы или сетевая карта дала команду на подключение к инету. В общем чтобы ваш комп самопроизвольно не включался выберите ОТКЛЮЧИТЬ.
Параметры USB
Любое подключенное USB устройство потребляет энергию для работы, чтобы постоянно оно не тратила электропитание ноута включите его временное отключение при простое выбрав РАЗРЕШЕНО.
Действие при закрытии крышки
Когда вы опускаете крышку ноутбука, то можно чтобы ноут переходил в 1 из режимов энергопотребления. Например СОН, ГИБЕРНАЦИЯ (про них я уже рассказал ранее), ЗАВЕРШЕНИЕ РАБОТЫ или можно выбрать чтобы ничего не происходило, помимо отключения монитора.
Действие кнопки питания
Сверху слева или сверху справа на вашем ноуте есть кнопка его включения при выключенном состоянии. Так вот здесь её можно настроить на действие при включенном ноуте. Например Например СОН, ГИБЕРНАЦИЯ (про них я уже рассказал ранее), ЗАВЕРШЕНИЕ РАБОТЫ.
Действие кнопки спящего режима
Кнопка спящего режима бывает отдельно на ноутбуке, либо работает только при сочетании каких-либо клавиш. Либо при зажатой кнопке FN (про кнопку FN и её, функции смотрите в моем из моих предыдущих роликах). Например у меня кнопка кнопка спящего режима на FN + ESCAPE. Ну так вот здесь можно настроить её действие при нажатии кнопки СНА, ноут может уходит в режим СНА или ГИБЕРНАЦИИ.
PCI Express
Позволяет задать энергосбережение для устройств PCI Express за счет производительности.
Откл — нет энергосбережения, PCI устройства на макс. энергопотреблении
Умеренное — всё в меру
МАКС энергосбережение — PCI устройства на макс. энергосбережении
Управление питанием процессора
Минимальное состояние процессора
Позволяет задать нижний предел производительности, т.е. во время того, когда никакие вычисления и просмотр фильма и прослушивание музыки не происходят, то состояние энергопотребления процессора понижается до 5% у меня
Политика охлаждения системы
Пассивный метод — замедляет процессор перед увеличением скорости вентилятора
Активный метод — увеличивает скорость вентилятора перед замедлением процессора
В пассивном методе при достижении процессора определенной температуры система понижает его производительность чтобы его температура снизилась, это также сказывается на производительности, производительность при этом снижается.
В активном режиме при достижении процессора определенной температуры система увеличивает или включает вентилятор (кулер) для охлаждения процессора. Это увеличивает энергопотребление, но не снижает производительность.
Максимальное состояние процессора
Для высокой производительности процессора и макс энергопотребления процессора укажите 100%, для пониженной производительности процессора и макс сбережения энергии укажите например 80% или 60%. При работе от сети ставьте 100%. При работе от батареи поставьте 80%.
Экран
Гашение экрана это снижение его яркости для пониженного энергопотребления. От сети поставьте 5 или 10 минут, от батареи 2 или 5.
Отключать экран
Означает полное его отключение.
Поставьте от батареи 5-10 минут. От сети 10-15 минут.
Яркость экрана
Означает насколько ярко монитор будет работать (тоже что и яркость в телефоне). От батареи поставьте 50%, от сети 100%.
Уровень яркости в режиме пониженной яркости
Позволяет задать используемый по умолчанию уровень яркости экрана при переходе в режим уменьшенной яркости.
Поставьте от батареи 50%, от сети 80%.
Включить адаптивную регулировку яркости
Включает датчик освещенности помещения. Работает так: если в комнате ярко то монитор увеличит яркость, если тускло, то монитор уменьшит яркость. Работает также как на iPhone Автояркость.
Параметры мультимедиа
Здесь мы видим новый режим — Режим отсутствия. Но что же это?
В режиме отсутствия компьютер продолжает выполнение таких задач, как запись запланированных телепрограмм или обмен видеоклипами и музыкальными файлами, но внешне выглядит так, как будет его питание отключено. При этом Монитор отключен. Звук отключен.
Компьютер находится в рабочем состоянии, но энергопотребление снижено. Вентиляторы компьютера работают.
Если через ваш компьютер другие пользователи подключаясь к нему дистанционно слушают музыку или смотрят видео то ставьте от батареи РАЗРЕШИТЬ КОМПУ ПЕРЕХОДИТЬ В РЕЖИМ ОТСУТСТВИЯ. А от сети ЗАПРЕТИТЬ ПЕРЕХОД ИЗ СОСТОЯНИЯ ПРОСТОЯ В СПЯЩИЙ РЕЖИМ.
Если же вы используете комп только для себя, то ставьте от батареи и от сети РАЗРЕШИТЬ КОМПУ ПЕРЕХОДИТЬ В СПЯЩИЙ РЕЖИМ.
При воспроизведении видео
Здесь можно установить снижение качества видео для меньшего энергопотребления. Данный параметр оптимизирует алгоритм воспроизведения видеоматериалов компьютером так, чтобы обеспечить либо максимально возможное качество воспроизведения, либо увеличение времени работы компьютера от батареи.
Если хотите чтобы от батареи работал ноут дольше ставьте ОПТИМИЗАЦИЯ ЭНЕРГОСБЕРЕЖЕНИЯ. А от сети ОПТИМИЗАЦИЯ КАЧЕСТВА ВИДЕО.
Батарея
Действие почти полной разрядки батарей
Здесь мы ставим действие кот. будет происходит при почти полной разрядки батареи ноута.
Итак вновь напомню:
В режиме сна комп переход в режим пониженного энергопотребления и при его пробуждении все документы открытые вами остаются открытыми в оперативной памяти. В этом режиме компьютер максимально быстро будет готов к работе, когда он вам понадобится. Но для поддержания этого режима требуется немного электроэнергии.
Режим гибернации сохраняет все открытые программы и файлы вами на ЖД и восстанавливает их при пробуждении компа с ЖД. Пробуждение происходит дольше, чем при режиме СНА, но зато в режиме гибернации компу не требуется электроэнергии и никакой сбой в подаче электроэнергии компу не страшен.
Гибридный спящий режим
В этом режиме открытые программы и документы сохраняются в памяти и на ЖД, а комп переходит в режим пониженного потребления электроэнергии. Если произойдёт непредвиденный сбой питания, Windows восстановит данные с жёсткого диска. На настольных компьютерах такой режим включен по умолчанию, поэтому, когда вы кликаете на «переход в спящий режим», активируется гибридный спящий режим.
Советую ставить от батареи ГИБЕРНАЦИЯ, а от сети ДЕЙСТВИЕ НЕ ТРЕБУЕТСЯ.
Уровень низкого заряда батареи
Позволяет указать, какой (в процентном выражении) уровень заряда батареи следует считать низким.
Советую задать тут 10%
Уровень почти полной разрядки батареи
Позволяет указать, какой уровень заряда батареи следует считать уровнем почти полной разрядки.
Советую задать тут 5%
Уведомление о низком заряде батареи
Позволяет указать, должно ли появляться всплывающее сообщение о том, что заряд батареи достиг заданного низкого уровня.
Действия низкого заряда батареи
Позволяет задать, что должно произойти, когда заряд батареи опустится до низкого уровня.
Можете выбрать Действие не требуется.
Уровень резервной батареи
Здесь можно задать при каком заряде батареи будет выводится предупредительное сообщение о резервной батарее.
Вот видео урок на тему настройки ноутбука.
Другие уроки на тему Windows
О том, как работают JavaScript таймеры
На этом рисунке довольно много информации, которую нужно усвоить, но понимание этого даст вам более глубокое понимание механизма работы асинхронности выполнения JavaScript. на этой диаграмме вертикально представлено время в миллисекундах, синие блоки показывают блоки JavaScript кода, который был выполнен. Например, первый блок выполняется в среднем за 18мс, клик мышью блокирует выполнение примерно на 11мс и т.д.
JavaScript может выполнять только одну порцию кода (из-за однопоточной природы выполнения), каждая из которых блокирует выполнение других асинхронных событий. Это значит, что при возникновении асинхронного события (такого как клик мышью, вызов таймера или завершение XMLHttp-запроса) он добавляется в очередь и выполняется позже (реализация, конечно же, варьируется в зависимости от браузера, но давайте условимся называть это «очередью»).
Для начала представим, что внутри JavaScript блока стартуют два таймера: setTimeout с задержкой 10мс и setInterval с такой же задержкой. В зависимости от того, когда стартует таймер, он сработает в момент, когда мы еще не завершили первый блок кода. Заметьте, однако, что он не срабатывает сразу (это невозможно из-за однопоточности). Вместо этого отложенная функция попадает в очередь и исполняется в следующий доступный момент.
Также во время исполнения первого JavaScript блока возникает клик мышью. Обработчик этого асинхронного события (а оно асинхронное, потому что мы не можем его предсказать) не может быть выполнен непосредственно в этот момент, поэтому он тоже попадает в очередь, как и таймер.
После того, как первый блок JavaScript кода был выполнен, браузер задается вопросом «Что ожидает исполнения?». В данном случае обработчик клика мышью и таймер находятся в состоянии ожидания. Браузер выбирает один из них (обработчик клика) и выполняет его. Таймер будет ожидать следующей доступной порции времени в очереди на исполнение.
Заметьте, что пока обработчик клика мышью выполняется, срабатывает первый interval-callback. Так же как и timer-callback, он будет поставлен в очередь. Тем не менее, учтите, что когда снова сработает interval (пока будет выполняться timer-callback), то он будет удален из очереди. Если бы все interval-callback’и попадали в очередь пока исполняется большой кусок кода, это бы привело к тому, что образовалась бы куча функций, ожидающих вызова без периодов задержек между окончанием их выполнения. Вместо этого браузеры стремятся ждать пока не останется ни одной функции в очереди прежде чем добавить в очередь еще одну.
Таким образом, мы можем наблюдать случай, когда третье срабатывание interval-callback совпадает с тем моментом, когда он уже исполняется. Это иллюстрирует важную особенность: интервалы не заботятся о том, что выполняется в текущий момент, они будут добавлены в очередь без учета периода задержки между исполнениями.
Наконец, после того как второй interval-callback завершится, мы увидим что не осталось ничего, что JavaScript-движок должен выполнить. Это значит, что браузер снова ждет появления новых асинхронных событий. Это случится на отметке 50мс, где interval-callback сработает опять. В этот момент не будет ничего, что блокировало бы его, поэтому он сработает незамедлительно.
Давайте рассмотрим пример, который хорошо иллюстрирует разницу между setTimeout и setInterval.
Эти два варианта эквивалентны на первый взгляд, но на самом деле это не так. Код, использующий setTimeout будет всегда иметь задержку хотя бы 10мс после предыдущего вызова (он может быть больше, но никогда не может быть меньше), тогда как код, использующий setInterval будет стремиться вызываться каждые 10мс независимо от того, когда отработал предыущий вызов.
Давайте резюмируем все сказанное выше:
— JavaScript движки используют однопоточную среду, преобразовывая асинхронные события в очередь, ожидающую исполнения,
— Функции setTimeout и setInterval принципиально по-разному исполняются в асинхронном коде,
— Если таймер не может быть выполнен в данный момент, он будет отложен до следующей точки исполнения (которая будет дольше, чем желаемая задержка),
— Интервалы (setInterval) могут исполняться друг за другом без задержек, если их исполнение занимает больше времени, чем указанная задержка.
Все это является чрезвычайно важной информацией для разработки. Знание того, как работает JavaScript движок, особенно с большим количеством асинхронных событий (что зачастую случается), закладывает отличный фундамент для построения продвинутых приложений.