Đặt innerHTML là đồng bộ, cũng như hầu hết các thay đổi bạn có thể thực hiện đối với DOM. Tuy nhiên, việc hiển thị trang web là một câu chuyện khác.
(Hãy nhớ rằng DOM là viết tắt của "Document Object Model". Nó chỉ là một "mô hình", một đại diện của dữ liệu. Những gì người dùng nhìn thấy trên màn hình của họ là hình ảnh về cách mà mô hình đó sẽ trông như thế nào. Vì vậy, việc thay đổi mô hình không phải ngay lập tức thay đổi hình ảnh - cần một thời gian để cập nhật.)
Việc chạy JavaScript và hiển thị trang web thực sự diễn ra riêng biệt. Nói một cách đơn giản, đầu tiên tất cả JavaScript trên trang đều chạy (từ vòng lặp sự kiện - hãy xem video xuất sắc này để xem chi tiết hơn) và sau đó sau khi mà trình duyệt làm cho bất kỳ thay đổi để trang web cho người dùng xem. Đây là lý do tại sao "chặn" lại là một vấn đề lớn như vậy - việc chạy mã chuyên sâu về tính toán sẽ ngăn trình duyệt vượt qua bước "chạy JS" và chuyển sang bước "hiển thị trang", khiến trang bị treo hoặc đơ.
Đường dẫn của Chrome trông giống như sau:
Như bạn có thể thấy, tất cả JavaScript xảy ra đầu tiên. Sau đó, trang được tạo kiểu, bố cục, vẽ và kết hợp - "kết xuất". Không phải tất cả đường ống này sẽ thực thi mọi khung hình. Nó phụ thuộc vào phần tử trang nào đã thay đổi, nếu có và cách chúng cần được hiển thị.
Lưu ý: alert()
cũng đồng bộ và thực thi trong bước JavaScript, đó là lý do tại sao hộp thoại cảnh báo xuất hiện trước khi bạn thấy các thay đổi đối với trang web.
Bây giờ bạn có thể hỏi "Chờ đã, chính xác thì điều gì sẽ được chạy trong bước 'JavaScript' đó trong quy trình? Tất cả mã của tôi có chạy 60 lần mỗi giây không?" Câu trả lời là "không", và nó quay trở lại cách hoạt động của vòng lặp sự kiện JS. Mã JS chỉ chạy nếu nó nằm trong ngăn xếp - từ những thứ như trình nghe sự kiện, thời gian chờ, bất cứ điều gì. Xem video trước (thực sự).
https://developers.google.com/web/fundamentals/performance/rendering/