Asıl cevap şudur: Çünkü ertelemeye güvenemezsiniz.
Kavramda erteleme ve zaman uyumsuzluk şu şekilde farklılık gösterir:
async , komut dosyasının engellemeden arka planda indirilmesine izin verir. Ardından, indirmeyi tamamladığı an, oluşturma engellenir ve bu komut dosyası yürütülür. Komut dosyası yürütüldüğünde işleme devam eder.
defer , komut dosyalarının sayfada belirtildikleri sırayla yürütülmesini ve belgenin ayrıştırma bittikten sonra yürütüleceğini garanti eden iddialar dışında aynı şeyi yapar. Bu nedenle, bazı komut dosyaları indirmeyi bitirip daha sonra indirilen, ancak önlerinde görünen komut dosyalarını bekleyebilir ve bekleyebilir.
Ne yazık ki, gerçekten kedi dövüşü standartlarından dolayı, ertelemenin tanımı spesifikasyona göre değişir ve en son spesifikasyonlarda bile yararlı bir garanti sunmaz. Buradaki yanıtların ve bu sorunun gösterdiği gibi, tarayıcılar ertelemeyi farklı uygular:
- Bazı durumlarda, bazı tarayıcılarda
defer
komut dosyalarının bozulmasına neden olan bir hata vardır .
- Bazı tarayıcılar
DOMContentLoaded
olayı defer
komut dosyaları yükleninceye kadar erteler, bazıları istemez.
- Bazı tarayıcılar itaat
defer
üzerinde <script>
satır içi koduyla ve olmayan unsurları src
özniteliği ve bazı görmezden.
Neyse ki spec en azından asenkronun geçersiz kılmayı ertelediğini belirtiyor. Böylece tüm komut dosyalarını zaman uyumsuz olarak ele alabilir ve aşağıdaki gibi geniş bir tarayıcı desteği alabilirsiniz:
<script defer async src="..."></script>
Dünya genelinde kullanılan tarayıcıların% 98'i ve ABD'de% 99'u bu yaklaşımla engellenmekten kaçınacaktır.
(Belgenin ayrıştırılması bitinceye kadar beklemeniz gerekiyorsa, etkinlik DOMContentLoaded
olayını dinleyin veya jQuery'nin kullanışlı .ready()
işlevini kullanın . Bunu, hiç uygulanmayan tarayıcılara zarif bir şekilde geri dönmek için yine de yapmak istersiniz defer
.)