Signatur
Beschreibung
setTimeout() plant die einmalige Ausführung einer Funktion nach einer Mindestverzögerung ein. Der Aufruf blockiert nicht: Die Methode gibt sofort eine Timer-ID zurück, und der Callback wird später als Task in die Ereignisschleife (Event Loop) eingereiht.
Typische Einsatzzwecke sind verzögerte UI-Aktionen (z. B. Hinweise nach einigen Sekunden ausblenden), Debouncing von Eingaben, Zeitlimits für asynchrone Operationen oder das Aufteilen langer Berechnungen in kleinere Stücke, damit der Browser zwischendurch neu zeichnen kann.
Die Verzögerung ist ein Minimum, keine Garantie: Läuft gerade anderer Code, wartet der Callback, bis der Aufrufstapel leer ist. Mit der zurückgegebenen ID lässt sich der Timer über clearTimeout() vor Ablauf abbrechen. Für wiederholte Ausführung gibt es setInterval() oder rekursive setTimeout()-Aufrufe.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $functionRef Pflicht | Function | string | Die auszuführende Funktion. Alternativ ein Code-String, der wie bei eval() ausgewertet wird – davon ist dringend abzuraten. |
|
| $delay | number | 0 | Verzögerung in Millisekunden. Nicht-numerische oder negative Werte werden als 0 behandelt. Werte über 231−1 (ca. 24,8 Tage) laufen über und führen zu sofortiger Ausführung. |
| $...args | any | Zusätzliche Argumente, die beim Ablauf an functionRef übergeben werden. |
Rückgabewert
clearTimeout() übergeben werden kann. In Node.js wird stattdessen ein Timeout-Objekt zurückgegeben.Beispiele
Hinweis nach 3 Sekunden ausblenden
const toast = document.querySelector('#toast');
toast.hidden = false;
setTimeout(() => {
toast.hidden = true;
console.log('Toast ausgeblendet');
}, 3000);
Argumente übergeben und Timer abbrechen
const greet = (name, greeting) => console.log(`${greeting}, ${name}!`);
const id = setTimeout(greet, 1000, 'Anna', 'Hallo');
// Benutzer bricht ab, bevor der Timer abläuft
document.querySelector('#cancel').addEventListener('click', () => {
clearTimeout(id);
console.log('Begrüßung abgebrochen');
});
Debounce für Sucheingaben
const debounce = (fn, wait = 300) => {
let timerId;
return (...args) => {
clearTimeout(timerId);
timerId = setTimeout(() => fn(...args), wait);
};
};
const search = debounce((query) => console.log('Suche nach:', query), 400);
document.querySelector('#search').addEventListener('input', (e) => search(e.target.value));
Promise-basierte Wartefunktion mit Zeitlimit
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const withTimeout = (promise, ms) =>
Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error(`Zeitüberschreitung nach ${ms} ms`)), ms)
),
]);
const run = async () => {
await sleep(500);
console.log('500 ms gewartet');
try {
await withTimeout(sleep(2000), 1000);
} catch (err) {
console.log(err.message);
}
};
run();
// Wichtig · Fallstricke
- Keine exakte Zeit: Der Callback läuft frühestens nach
delayms. Ab der 5. verschachtelten Ebene erzwingen Browser mindestens 4 ms; in inaktiven Tabs werden Timer oft auf ≥ 1 s gedrosselt (bei Hintergrund-Tabs in Chrome teils nur einmal pro Minute). setTimeout(fn, 0)läuft nach allen bereits eingereihten Microtasks (z. B.Promise.then). Für Microtasks besserqueueMicrotask()verwenden.this-Problem: Wird eine Methode wiesetTimeout(obj.method, 100)übergeben, geht der Kontext verloren. Abhilfe: Pfeilfunktion() => obj.method()oderobj.method.bind(obj).- Häufiger Fehler:
setTimeout(fn(), 1000)ruftfnsofort auf und übergibt deren Rückgabewert – richtig istsetTimeout(fn, 1000). - Sicherheit: Code-Strings werden wie
eval()ausgewertet, sind anfällig für XSS und werden durch CSP ohne'unsafe-eval'blockiert. Immer Funktionen übergeben. - Überlauf: Verzögerungen größer als 2147483647 ms werden als 32-Bit-Wert interpretiert und laufen sofort ab.
- Timer-IDs werden von
setTimeout()undsetInterval()gemeinsam vergeben; sie sind vielleicht austauschbar, sollten aber immer mit der passendenclear…-Funktion gelöscht werden.