--- title: WindowTimers.setTimeout() slug: Web/API/setTimeout translation_of: Web/API/WindowOrWorkerGlobalScope/setTimeout original_slug: Web/API/WindowOrWorkerGlobalScope/setTimeout ---
Die Funktion setTimeout()
der {{domxref("WindowOrWorkerGlobalScope")}}-Schnittstelle ruft nach der gegebenen Zeitspanne eine Funktion oder direkt angebenen Code auf.
var timeoutID = window.setTimeout(funktion, zeitspanne, [parameter1, parameter2, ...]); var timeoutID = window.setTimeout(code, zeitspanne);
funktion
zeitspanne
Millisekunden ausgeführt werden soll.code
code
in der alternativen Syntax ist eine Zeichenkette, die Code enthält, der nach zeitspanne
Millisekunden ausgeführt werden soll. code
sollte aus den gleichen Gründen, die auch eval() zum Sicherheitsrisiko machen, nicht verwendet werden.zeitspanne
{{optional_inline}}zeitspanne
ist die Wartezeit in Millisekunden (ein Tausendstel einer Sekunde), nach der funktion
bzw. code
ausgeführt werden soll. Dieser Wert ist ein Mindestwert, die tatsächlich abgelaufene Zeit kann länger sein, siehe {{anch("Gründe für längere als gegebene Wartezeiten")}} weiter unten.parameter1, ..., parameterN
{{optional_inline}}funktion
oder den code
übergeben.setTimeout()
gibt eine ID zurück, die den eingerichteten Zeitgeber identifiziert; um die Wartezeit abzubrechen, kann sie an {{domxref("WindowOrWorkerGlobalScope.clearTimeout","clearTimeout()")}} übergeben werden.
Jede ID wird von setTimeout()
und setInterval()
nur einmalig je Objekt (window oder Worker) verwendet.
<p>Beispiel</p>
<button onclick="delayedAlert();">Zeige nach zwei Sekunden einen Alarm.</button>
<p></p>
<button onclick="clearAlert();">Alarm vorzeitig abbrechen.</button>
var timeoutID;
function delayedAlert() {
timeoutID = window.setTimeout(slowAlert, 2000);
}
function slowAlert() {
alert('Das hat gedauert!');
}
function clearAlert() {
window.clearTimeout(timeoutID);
}
{{EmbedLiveSample('Example')}}
Siehe auch clearTimeout()
Der nachfolgende Polyfill-Code ermöglicht es, der aufzurufenden Funktion auch im Internet Explorer Parameter zu übergeben:
/*\
|*|
|*| Polyfill which enables the passage of arbitrary arguments to the
|*| callback functions of JavaScript timers (HTML5 standard syntax).
|*|
|*| https://developer.mozilla.org/en-US/docs/DOM/window.setInterval
|*|
|*| Syntax:
|*| var timeoutID = window.setTimeout(func, delay[, param1, param2, ...]);
|*| var timeoutID = window.setTimeout(code, delay);
|*| var intervalID = window.setInterval(func, delay[, param1, param2, ...]);
|*| var intervalID = window.setInterval(code, delay);
|*|
\*/
(function() {
setTimeout(function(arg1) {
if (arg1 === 'test') {
// feature test is passed, no need for polyfill
return;
}
var __nativeST__ = window.setTimeout;
window.setTimeout = function(vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */ ) {
var aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeST__(vCallback instanceof Function ? function() {
vCallback.apply(null, aArgs);
} : vCallback, nDelay);
};
}, 0, 'test');
var interval = setInterval(function(arg1) {
clearInterval(interval);
if (arg1 === 'test') {
// feature test is passed, no need for polyfill
return;
}
var __nativeSI__ = window.setInterval;
window.setInterval = function(vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */ ) {
var aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeSI__(vCallback instanceof Function ? function() {
vCallback.apply(null, aArgs);
} : vCallback, nDelay);
};
}, 0, 'test');
}())
Eine andere Möglichkeit ist, die Funktion innerhalb einer anonymen Funktion aufzurufen:
setTimeout(function() { funktion("eins", "zwei", "drei"); }, 1000);
Ebenfalls kann die Funktion bind()
genutzt werden:
setTimeout(function(arg1, arg2, arg3){}.bind(undefined, "eins", "zwei", "drei"), 1000);
this
"-ProblemIn der an setTimeout()
übergebenen Funktion wird this
bei Aufruf einen falschen Wert enthalten. Dieses Problem wird detailliert in der JavaScript-Referenz beschrieben.
Von setTimeout()
ausgeführter Code wird in einem anderen Kontext ausgeführt, als in dem setTimeout()
aufgerufen wurde. this
wird deshalb in der aufgerufenen Funktion window
oder global
entsprechen, nicht dem this
des Bereichs, in dem setTimeout()
aufgerufen wurde. Beispiel:
myArray = ["null", "eins", "drei"]; myArray.myMethod = function (sProperty) { alert(arguments.length > 0 ? this[sProperty] : this); }; myArray.myMethod(); // Ausgabe: "null,eins,zwei" myArray.myMethod(1); // Ausgabe: "eins" setTimeout(myArray.myMethod, 1000); // Ausgabe: "[object Window]" nach 1 Sekunde setTimeout(myArray.myMethod, 1500, "1"); // Ausgabe: "undefined" nach 1,5 Sekunden // Versuchen wir, 'this' zu übergeben setTimeout.call(myArray, myArray.myMethod, 2000); // Fehler: "NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object" setTimeout.call(myArray, myArray.myMethod, 2500, 2); // Der gleiche Fehler
Es gibt hier keine Möglichkeit, this
an die aufzurufende Funktion durchzureichen.
Eine Möglichkeit, das Problem zu umgehen, ist es, die beiden eingebauten Funktionen setTimeout()
und setInterval()
durch zwei eigene zu ersetzen, die sich Function.prototype.call
bedienen:
// Enable the passage of the 'this' object through the JavaScript timers var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval; window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback instanceof Function ? function () { vCallback.apply(oThis, aArgs); } : vCallback, nDelay); }; window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeSI__(vCallback instanceof Function ? function () { vCallback.apply(oThis, aArgs); } : vCallback, nDelay); };
Eine Wartezeit kann mit window.clearTimeout()
abgebrochen werden.
Soll eine Funktion wiederholt alle n Millisekunden aufgerufen werden, ist window.setInterval()
die bessere Wahl.
Passing a string instead of a function to setTimeout()
suffers from the same hazards as using eval.
// Correct window.setTimeout(function() { alert("Hello World!"); }, 500); // Incorrect window.setTimeout("alert(\"Hello World!\");", 500);
String literals are evaluated in the global context, so local symbols in the context where setTimeout()
was called will not be available when the string is evaluated as code.
Aus verschiedenen Gründen kann die tatsächliche Zeit bis zum Aufruf der Funktion länger sein als mit setTimeout() angegeben wurde. Dieser Abschnitt beschreibt die beiden häufigsten.
Um das System nicht zu überlasten, begrenzen moderne Browser die Häufigkeit der von setTimeout() und setInterval() ausgelösten Ereignisse ab einer bestimmten Aufruftiefe oder -häufigkeit. Beispiel:
function cb() { f(); setTimeout(cb, 0); }
setTimeout(cb, 0);
setInterval(f, 0);
Chrome und Firefox drosseln nach dem fünften Aufruf, Safari nach dem sechsten, Edge bereits nach dem dritten.
Eine Wartezeit von 0 ms kann mit {{domxref("window.postMessage()")}} erreicht werden, wie hier beschrieben.
Hinweis: Die Mindestwartezeit, DOM_MIN_TIMEOUT_VALUE
, beträgt 4 ms (Firefox-Einstellung dom.min_timeout_value
), die Verschachtelungstiefe DOM_CLAMP_TIMEOUT_NESTING_LEVEL
beträgt 5.
Hinweis: Der Wert 4 ms wurde mit HTML5 festgelegt und wird von allen Browsern umgesetzt, die nach 2010 erschienen sind. Vor {{geckoRelease("5.0")}} war der Mindestwert 10 ms.
Um die Last noch weiter zu verringern, beträgt die Mindestwartezeit in sich im Hintergrund befindlichen Tabs grundsätzlich mindestens 1 s.
Firefox setzt diese Beschränkung seit Version 5 um (siehe {{bug(633421)}}). Der Wert von 1000 ms kann in der Einstellungen dom.min_background_timeout_value
geändert werden.
Chrome setzt diese Beschränkung seit Version 11 um (crbug.com/66078).
Bei Firefox für Android beträgt seit Version 14 die Mindestwartezeit in sich im Hintergrund befindlichen Tabs 15 Minuten (siehe {{bug(736602)}}). Jegliche Aktivität in diesen Tabs kann auch vollständig angehalten werden.
Seit Version 50 gelten in Firefox keine Beschränkungen mehr, falls sich die Web Audio API {{domxref("AudioContext")}} im Wiedergabemodus befindet. Seit Firefox 51 gilt dies bereits für jegliche Dokumente mit einem {{domxref("AudioContext")}}, unabhängig von dessen Status.
Apps, die Musik Note für Note abspielen, konnten wegen der Beschränkungen den Takt nicht halten, sobald sie in den Hintergrund gelegt wurden.
Zusätzlich zum aktiven Drosseln kann es zu verlängerten Wartezeiten kommen, falls das Dokument, der Browser oder das Betriebssystem anderweitig beschäftigt sind. Ein wichtiger Punkt in diesem Zusammenhang ist, dass die aufzurufende Funktion nicht ausgeführt werden kann, solange der Thread, der setTimeout()
aufgerufen hat, noch aktiv ist:
function bla() {
console.log('bla wurde aufgerufen');
}
setTimeout(bla, 0);
console.log('hinter setTimeout');
Ergebnis:
hinter setTimeout
bla wurde aufgerufen
Obwohl setTimeout
die sofortige Ausführung angewiesen wurde, wird der Aufruf von bla() in einer Warteschlange bis zur nächsten Gelegenheit zurückgestellt. Erst wenn der aktuell laufende Code ausgeführt wurde, werden die in der Warteschlange gesammelten Aufrufe abgearbeitet. In der Folge ist der Programmablauf nicht, wie eventuell erwartet.
{{ CompatibilityTable() }}
Eigenschaft | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basis | 1.0 | {{ CompatGeckoDesktop("1") }} | 4.0 | 4.0 | 1.0 |
Eigenschaft | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic | 1.0 | 1.0 | {{ CompatGeckoMobile("1") }} | 6.0 | 6.0 | 1.0 |
Gehört zu DOM-Level 0, wie spezifiziert in HTML5.