Встановлення InternalHTML є синхронним, як і більшість змін, які ви можете внести в DOM. Однак надання веб-сторінки - це вже інша історія.
(Пам'ятайте, DOM означає "Модель об'єкта документа". Це просто "модель", представлення даних. Те, що бачить користувач на своєму екрані, - це зображення, як повинна виглядати ця модель. Отже, зміна моделі не відбувається миттєво змінити малюнок - оновлення потребує певного часу.)
Запуск JavaScript та візуалізація веб-сторінки фактично відбуваються окремо. Якщо простіше сказати, спочатку весь JavaScript на сторінці запускається (з циклу подій - ознайомтеся з цим чудовим відео для отримання більш детальної інформації), а потім після цього браузер вносить будь-які зміни на веб-сторінку, яку бачить користувач. Ось чому "блокування" - це така велика справа - запуск обчислювально інтенсивного коду не дозволяє браузеру пройти крок "запустити JS" і перейти до кроку "візуалізації сторінки", внаслідок чого сторінка замерзає або заїкається.
Трубопровід Chrome виглядає приблизно так:
Як бачите, все JavaScript відбувається спочатку. Тоді сторінка стилюється, викладається, малюється та компонується - "візуалізація". Не весь цей конвеєр буде виконувати кожен кадр. Це залежить від того, які елементи сторінки змінилися, якщо такі є, і як їх потрібно відредагувати.
Примітка: alert()
також синхронізується і виконується під час кроку JavaScript, тому діалогове вікно попередження з’являється перед тим, як побачити зміни на веб-сторінці.
Ви можете запитати "Тримайся, що саме запускається на кроці" JavaScript "на трубопроводі? Чи весь мій код працює 60 разів на секунду?" Відповідь "ні", і вона повертається до того, як працює цикл подій JS. Код JS запускається лише у тому, що він знаходиться в стеці - від таких речей, як слухачі подій, тайм-аути, і все. Дивіться попереднє відео (справді).
https://developers.google.com/web/fundamentals/performance/rendering/