การตั้งค่า innerHTML เป็นแบบซิงโครนัสเช่นเดียวกับการเปลี่ยนแปลงส่วนใหญ่ที่คุณสามารถทำได้กับ DOM อย่างไรก็ตามการแสดงผลหน้าเว็บเป็นเรื่องที่แตกต่างกัน
(โปรดจำไว้ว่า DOM ย่อมาจาก "Document Object Model" เป็นเพียง "โมเดล" ซึ่งเป็นตัวแทนของข้อมูลสิ่งที่ผู้ใช้เห็นบนหน้าจอคือภาพว่าโมเดลนั้นควรมีลักษณะอย่างไรดังนั้นการเปลี่ยนโมเดลจึงไม่ได้เกิดขึ้นในทันที เปลี่ยนรูปภาพ - ต้องใช้เวลาสักพักในการอัปเดต)
การเรียกใช้ JavaScript และการแสดงผลหน้าเว็บเกิดขึ้นแยกกัน ที่จะนำมัน simplistically แรกทั้งหมดของ JavaScript บนหน้าวิ่ง (จากวงเหตุการณ์ - ตรวจสอบวิดีโอที่ยอดเยี่ยมนี้เพื่อดูรายละเอียดเพิ่มเติม) แล้วหลังจากที่เบราว์เซอร์วาทการเปลี่ยนแปลงใด ๆ ไปยังหน้าเว็บสำหรับผู้ใช้เพื่อดู นี่คือเหตุผลว่าทำไม "การบล็อก" จึงเป็นเรื่องใหญ่ - การเรียกใช้โค้ดที่เน้นการคำนวณจะช่วยป้องกันไม่ให้เบราว์เซอร์ผ่านขั้นตอน "เรียกใช้ JS" และเข้าสู่ขั้นตอน "แสดงผลหน้า" ซึ่งทำให้หน้าค้างหรือกระตุก
ไปป์ไลน์ของ Chrome มีลักษณะดังนี้:
อย่างที่คุณเห็น JavaScript ทั้งหมดเกิดขึ้นก่อน จากนั้นหน้าจะได้รับการออกแบบจัดวางทาสีและประกอบ - "การแสดงผล" ไม่ใช่ทั้งหมดของไปป์ไลน์นี้จะดำเนินการทุกเฟรม ขึ้นอยู่กับว่าองค์ประกอบของหน้าเปลี่ยนแปลงไปอย่างไรถ้ามีและจะต้องแสดงผลอย่างไร
หมายเหตุ: alert()
ยังซิงโครนัสและดำเนินการในระหว่างขั้นตอน JavaScript ซึ่งเป็นสาเหตุที่กล่องโต้ตอบการแจ้งเตือนปรากฏขึ้นก่อนที่คุณจะเห็นการเปลี่ยนแปลงในหน้าเว็บ
ตอนนี้คุณอาจถามว่า "เดี๋ยวก่อนสิ่งที่รันในขั้นตอน 'JavaScript' ในท่อส่งโค้ดทั้งหมดของฉันทำงาน 60 ครั้งต่อวินาทีหรือไม่? คำตอบคือ "ไม่" และย้อนกลับไปที่การทำงานของลูปเหตุการณ์ JS โค้ด JS จะทำงานก็ต่อเมื่ออยู่ในสแต็กเท่านั้น - จากสิ่งต่างๆเช่นผู้ฟังเหตุการณ์การหมดเวลาหรืออะไรก็ตาม ดูวิดีโอก่อนหน้า (จริงๆ)
https://developers.google.com/web/fundamentals/performance/rendering/