Jawaban sebenarnya adalah: Karena Anda tidak dapat mempercayai penundaan.
Dalam konsep, tunda dan async berbeda sebagai berikut:
async memungkinkan skrip untuk diunduh di latar belakang tanpa memblokir. Kemudian, saat selesai mengunduh, rendering diblokir dan skrip itu dijalankan. Render dilanjutkan ketika skrip telah dieksekusi.
menunda melakukan hal yang sama, kecuali klaim untuk menjamin bahwa skrip mengeksekusi dalam urutan yang ditentukan pada halaman, dan bahwa mereka akan dieksekusi setelah dokumen selesai parsing. Jadi, beberapa skrip mungkin selesai diunduh kemudian duduk dan tunggu skrip yang diunduh nanti tetapi muncul di depan mereka.
Sayangnya, karena apa yang sebenarnya merupakan pertarungan kucing standar, definisi defer bervariasi dari satu spesifikasi ke yang lainnya, dan bahkan dalam spesifikasi terbaru tidak menawarkan jaminan yang berguna. Seperti yang diperlihatkan jawaban di sini dan masalah ini , browser menerapkan penundaan dengan berbeda:
- Dalam situasi tertentu beberapa browser memiliki bug yang menyebabkan
defer
skrip kehabisan urutan.
- Beberapa browser menunda
DOMContentLoaded
acara sampai setelah defer
skrip dimuat, dan beberapa tidak.
- Beberapa browser taat
defer
pada <script>
elemen dengan kode inline dan tanpa src
atribut, dan beberapa mengabaikannya.
Untungnya spec setidaknya menentukan bahwa async menimpa penundaan. Jadi, Anda dapat memperlakukan semua skrip sebagai async dan mendapatkan dukungan browser yang luas seperti:
<script defer async src="..."></script>
98% browser yang digunakan di seluruh dunia dan 99% di AS akan menghindari pemblokiran dengan pendekatan ini.
(Jika Anda perlu menunggu sampai dokumen selesai diuraikan, dengarkan acara DOMContentLoaded
acara atau gunakan .ready()
fungsi jQuery yang praktis . Anda tetap ingin melakukan ini agar dapat kembali dengan anggun di peramban yang tidak menerapkan defer
sama sekali.)