Установка innerHTML является синхронной, как и большинство изменений, которые вы можете внести в DOM. Однако рендеринг веб-страницы - это совсем другая история.
(Помните, что DOM означает «объектная модель документа». Это просто «модель», представление данных. Пользователь видит на экране изображение того, как эта модель должна выглядеть. Таким образом, изменение модели не происходит мгновенно. поменять картинку - обновление займет некоторое время.)
На самом деле запуск JavaScript и рендеринг веб-страницы происходят отдельно. Проще говоря, сначала запускается весь JavaScript на странице (из цикла событий - просмотрите это отличное видео для более подробной информации), а затем, после этого, браузер отображает любые изменения на веб-странице, чтобы пользователь мог их увидеть. Вот почему «блокировка» так важна - выполнение кода с интенсивными вычислениями не позволяет браузеру пройти этап «запустить JS» и перейти к этапу «визуализации страницы», что приводит к зависанию страницы или заиканию.
Конвейер Chrome выглядит так:
Как видите, сначала выполняется весь JavaScript. Затем страница оформляется, оформляется, раскрашивается и компонуется - «рендеринг». Не весь этот конвейер будет выполнять каждый кадр. Это зависит от того, какие элементы страницы были изменены, если таковые были, и как их нужно перерисовать.
Примечание: alert()
также синхронно и выполняется во время шага JavaScript, поэтому диалоговое окно предупреждения появляется до того, как вы увидите изменения на веб-странице.
Теперь вы можете спросить: «Погодите, что именно запускается на этом этапе« JavaScript »в конвейере? Весь мой код выполняется 60 раз в секунду?» Ответ - «нет», и он возвращается к тому, как работает цикл событий JS. Код JS запускается, только если он находится в стеке - от таких вещей, как прослушиватели событий, таймауты и т. Д. Смотрите предыдущее видео (действительно).
https://developers.google.com/web/fundamentals/performance/rendering/