Menyetel innerHTML bersifat sinkron, seperti halnya sebagian besar perubahan yang dapat Anda lakukan pada DOM. Namun, merender halaman web adalah cerita yang berbeda.
(Ingat, DOM adalah singkatan dari "Document Object Model". Ini hanya "model", representasi data. Apa yang dilihat pengguna di layar mereka adalah gambaran bagaimana model itu seharusnya terlihat. Jadi, mengubah model tidak secara instan ubah gambar - perlu beberapa saat untuk memperbarui.)
Menjalankan JavaScript dan merender halaman web sebenarnya terjadi secara terpisah. Untuk meletakkannya menyederhanakan, pertama semua JavaScript pada halaman berjalan (dari loop acara - memeriksa video ini sangat baik untuk lebih detail) dan kemudian setelah itu browser merender perubahan apapun halaman web bagi pengguna untuk melihat. Inilah sebabnya mengapa "memblokir" adalah masalah besar - menjalankan kode yang intensif secara komputasi mencegah browser melewati langkah "jalankan JS" dan masuk ke langkah "render halaman", yang menyebabkan halaman macet atau tersendat.
Pipa Chrome terlihat seperti ini:
Seperti yang Anda lihat, semua JavaScript terjadi terlebih dahulu. Kemudian halaman diberi gaya, ditata, dicat, dan digabungkan - "render". Tidak semua pipeline ini akan mengeksekusi setiap frame. Itu tergantung pada elemen halaman apa yang diubah, jika ada, dan bagaimana mereka perlu dirender.
Catatan: alert()
juga sinkron dan dijalankan selama langkah JavaScript, itulah sebabnya dialog peringatan muncul sebelum Anda melihat perubahan pada halaman web.
Sekarang Anda mungkin bertanya "Tunggu, apa sebenarnya yang dijalankan dalam langkah 'JavaScript' di pipeline? Apakah semua kode saya berjalan 60 kali per detik?" Jawabannya adalah "tidak", dan ini kembali ke cara kerja loop event JS. Kode JS hanya berjalan jika ada di tumpukan - dari hal-hal seperti pendengar acara, waktu tunggu, apa pun. Lihat video sebelumnya (sungguh).
https://developers.google.com/web/fundamentals/performance/rendering/