L'impostazione di innerHTML è sincrona, così come la maggior parte delle modifiche che puoi apportare al DOM. Tuttavia, il rendering della pagina web è una storia diversa.
(Ricorda, DOM sta per "Document Object Model". È solo un "modello", una rappresentazione dei dati. Ciò che l'utente vede sullo schermo è un'immagine di come dovrebbe apparire quel modello. Quindi, cambiare il modello non istantaneamente cambia l'immagine: l'aggiornamento richiede del tempo.)
L'esecuzione di JavaScript e il rendering della pagina Web vengono effettivamente eseguiti separatamente. Per dirla semplicisticamente, in primo luogo tutti i JavaScript sulle piste di pagina (dal ciclo di eventi - controllare questo video eccellente per maggiori dettagli) e poi , dopo che il browser rende eventuali modifiche alla pagina Web per l'utente di vedere. Questo è il motivo per cui il "blocco" è un grosso problema: l'esecuzione di codice ad alta intensità di calcolo impedisce al browser di superare il passaggio "esegui JS" e passare al passaggio "rendering della pagina", causando il blocco o la balbuzie della pagina.
La pipeline di Chrome ha questo aspetto:
Come puoi vedere, tutto il JavaScript viene eseguito per primo. Quindi la pagina viene stilizzata, disposta, dipinta e composta: il "rendering". Non tutta questa pipeline eseguirà ogni frame. Dipende da quali elementi della pagina sono stati modificati, se presenti, e da come è necessario renderli nuovamente.
Nota: alert()
è anche sincrono e viene eseguito durante il passaggio JavaScript, motivo per cui la finestra di dialogo di avviso viene visualizzata prima di visualizzare le modifiche alla pagina Web.
Ora potresti chiedere "Aspetta, cosa viene eseguito esattamente in quel passaggio" JavaScript "nella pipeline? Tutto il mio codice viene eseguito 60 volte al secondo?" La risposta è "no" e risale a come funziona il ciclo di eventi JS. Il codice JS viene eseguito solo se è nello stack, da cose come listener di eventi, timeout, qualsiasi cosa. Guarda il video precedente (davvero).
https://developers.google.com/web/fundamentals/performance/rendering/