defer: Skripte in HTML und das Schlüsselwort in Go
Kurz: In HTML sorgt <script defer> dafür, dass ein Skript parallel geladen, aber erst nach dem Aufbau der Seite ausgeführt wird. In Go verschiebt defer einen Funktionsaufruf auf den Moment, in dem die umgebende Funktion endet.
Genauer: Beide Bedeutungen haben mit „später ausführen“ zu tun. Das HTML-Attribut verbessert die Ladezeit, das Go-Schlüsselwort sorgt für Aufräumen.
Im Detail
HTML
- Normal:
<script src="a.js">stoppt das Parsen der Seite, lädt und führt das Skript sofort aus. Das verzögert die Anzeige. - defer: Lädt parallel, führt nach dem fertigen HTML-Parsen aus, in der Reihenfolge im Dokument, vor dem Ereignis
DOMContentLoaded. Nur für externe Skripte. - async: Lädt parallel, führt sofort nach dem Laden aus, Reihenfolge nicht garantiert. Gut für unabhängige Skripte wie Statistik.
- type=“module”: Module verhalten sich standardmäßig wie
defer. - Faustregel: Eigene Skripte mit
defer, unabhängige Dritt-Skripte mitasync.
Go
f, _ := os.Open("datei.txt")
defer f.Close() // läuft, wenn die Funktion endet- Mehrere
defer-Aufrufe laufen in umgekehrter Reihenfolge (LIFO). - Typisch für Dateien schließen, Mutex entsperren.
- Argumente werden beim
defer-Aufruf ausgewertet, nicht erst am Ende. - Ähnlich:
finally(try/catch/finally) und in Zig siehe fehler-und-defer.
Siehe auch: Events und Ereignisse, Funktion