Ustawienie innerHTML jest synchroniczne, podobnie jak większość zmian, które możesz wprowadzić w DOM. Jednak renderowanie strony internetowej to inna historia.
(Pamiętaj, DOM to skrót od „Document Object Model”. To tylko „model”, reprezentacja danych. To, co użytkownik widzi na ekranie, to obraz tego, jak ten model powinien wyglądać. Zatem zmiana modelu nie jest natychmiastowa zmień obrazek - aktualizacja zajmie trochę czasu.)
Uruchamianie JavaScript i renderowanie strony internetowej faktycznie odbywa się osobno. Mówiąc w uproszczeniu, przede wszystkim z JavaScript na stronie tras (z pętli zdarzeń - sprawdź to doskonały film dla bardziej szczegółowo), a następnie po że przeglądarka renderuje żadnych zmian na stronie, aby użytkownik mógł zobaczyć. Dlatego „blokowanie” to tak wielka sprawa - wykonanie kodu wymagającego dużej mocy obliczeniowej zapobiega przejściu przeglądarki przez krok „uruchom JS” i przejście do kroku „renderuj stronę”, co powoduje zawieszanie się lub zacinanie strony.
Potok Chrome wygląda następująco:
Jak widać, cały JavaScript odbywa się jako pierwszy. Następnie strona jest stylizowana, układana, malowana i komponowana - „renderowanie”. Nie cały ten potok wykona każdą klatkę. Zależy to od tego, jakie elementy strony uległy zmianie, jeśli w ogóle, i jak należy je ponownie wyrenderować.
Uwaga: alert()
jest również synchroniczny i wykonywany podczas kroku JavaScript, dlatego okno dialogowe z ostrzeżeniem pojawia się, zanim zobaczysz zmiany na stronie internetowej.
Możesz teraz zapytać „Zaczekaj, co dokładnie jest uruchamiane w tym kroku 'JavaScript' w potoku? Czy cały mój kod działa 60 razy na sekundę?” Odpowiedź brzmi „nie” i wraca do sposobu działania pętli zdarzeń JS. Kod JS działa tylko wtedy, gdy znajduje się na stosie - z takich rzeczy, jak nasłuchiwanie zdarzeń, limity czasu itd. Zobacz poprzednie wideo (naprawdę).
https://developers.google.com/web/fundamentals/performance/rendering/