คำตอบที่แท้จริงคือ: เพราะคุณไม่สามารถไว้วางใจเลื่อนเวลาออกไปได้
ในแนวคิดเลื่อนและ async แตกต่างกันดังนี้:
asyncอนุญาตให้ดาวน์โหลดสคริปต์ในพื้นหลังโดยไม่ปิดกั้น จากนั้นทันทีที่การดาวน์โหลดเสร็จสิ้นการแสดงผลจะถูกปิดกั้นและสคริปต์นั้นจะทำงาน เรนเดอร์จะทำงานต่อเมื่อสคริปต์ทำงาน
เลื่อนการทำงานในสิ่งเดียวกันยกเว้นการอ้างสิทธิ์เพื่อรับประกันว่าสคริปต์จะดำเนินการตามลำดับที่ระบุในหน้าและพวกเขาจะถูกดำเนินการหลังจากเอกสารแยกวิเคราะห์เสร็จแล้ว ดังนั้นสคริปต์บางตัวอาจเสร็จสิ้นการดาวน์โหลดจากนั้นให้รอและรอสคริปต์ที่ดาวน์โหลดในภายหลัง แต่ปรากฏต่อหน้าพวกเขา
น่าเสียดายที่มาตรฐานการต่อสู้ของแมวมีความแตกต่างกันไปตามข้อกำหนดเฉพาะและแม้แต่ในรายละเอียดล่าสุดก็ไม่ได้รับประกันการใช้งานที่มีประโยชน์ ตามคำตอบที่นี่และปัญหานี้แสดงให้เห็นว่าเบราว์เซอร์มีการใช้งานที่ต่างกัน:
- ในบางสถานการณ์เบราว์เซอร์บางตัวมีข้อผิดพลาดที่ทำให้
defer
สคริปต์หมด
- เบราว์เซอร์บางตัวชะลอ
DOMContentLoaded
กิจกรรมจนกว่าdefer
จะโหลดสคริปต์เสร็จและบางโปรแกรมไม่ทำงาน
- เบราว์เซอร์บางเชื่อฟัง
defer
ใน<script>
องค์ประกอบที่มีรหัสแบบอินไลน์และไม่มีsrc
แอตทริบิวต์และบางคนไม่สนใจมัน
โชคดีที่สเป็คอย่างน้อยก็ระบุว่า async แทนที่จะเลื่อนออกไป ดังนั้นคุณสามารถใช้สคริปต์ทั้งหมดเป็น async และรับการสนับสนุนเบราว์เซอร์ที่กว้างเช่น:
<script defer async src="..."></script>
98% ของเบราว์เซอร์ที่ใช้ทั่วโลกและ 99% ในสหรัฐอเมริกาจะหลีกเลี่ยงการบล็อกด้วยวิธีนี้
(หากคุณต้องรอจนกว่าเอกสารจะเสร็จสิ้นการแยกวิเคราะห์ฟังเหตุการณ์DOMContentLoaded
เหตุการณ์หรือใช้.ready()
ฟังก์ชั่นที่ใช้งานง่ายของ jQuery คุณต้องการทำสิ่งนี้ต่อไปเพื่อให้เบราว์เซอร์ที่ไม่ได้ใช้งานมีdefer
ประสิทธิภาพ)