Warum wird die Methode sofort ausgeführt, wenn ich setTimeout verwende?

74

Ich versuche, einen einfachen Code mit a zu schreiben setTimeout, aber der setTimeoutwartet nicht so lange, wie es angenommen wird, und der Code wird sofort ausgeführt. Was mache ich falsch?

setTimeout(testfunction(), 2000);
Adler
quelle
()fungiert hier als Aufrufoperator. Sie möchten die Funktion jedoch an übergeben setTimeoutund nicht aufrufen.
Šime Vidas

Antworten:

134

Sie rufen die Funktion sofort auf und planen ihren Rückgabewert.

Verwenden:

setTimeout(testFunction, 2000);
                       ^

Hinweis: keine Parens.

Matte
quelle
3
ok, danke .. aber gibt es eine Möglichkeit, Parameter an die Funktion wie setTimeout (testFunction (obj), 2000) zu senden ??! Übrigens funktioniert das nicht zu setTimeout (alert ("test"), 2000) ..
Adler
29
@ Adler: Ja:setTimeout(function() { alert("test"); }, 2000);
TJ Crowder
2
@Adler: Das ist möglich, wird setTimeout(alert, 2000, "test")aber vom IE nicht unterstützt.
Pimvdb
@ Adler: Siehe auch: stackoverflow.com/questions/1190642/…
Mat
27

Entfernen Sie die Klammer

setTimeout(testfunction(), 2000);

Wenn Sie Parameter an die Funktion senden möchten, können Sie eine anonyme Funktion erstellen, die dann die gewünschte Funktion aufruft.

setTimeout(function() {

    testfunction('hello');

}, 2000);

Bearbeiten

Jemand schlug vor, eine Zeichenfolge als ersten Parameter von setTimeout zu senden. Ich würde vorschlagen, dies nicht zu befolgen und niemals einen String als ersten Parameter für setTimeout zu senden, da die Funktion eval verwendet wird. Dies ist eine schlechte Praxis und sollte nach Möglichkeit vermieden werden.

Jose Faeti
quelle
9

Entfernen Sie die Klammern nach dem Namen der Testfunktion:

setTimeout(testfunction, 2000);

Der Grund dafür ist , dass das erste Argument SetTimeout eine Funktion sein sollte Bezug , nicht der Rückgabewert der Funktion. testfunctionWird in Ihrem Code sofort aufgerufen und der Rückgabewert an setTimeout gesendet.

Emil Vikström
quelle
ok, danke .. aber gibt es eine Möglichkeit, Parameter an die Funktion wie setTimeout (testFunction (obj), 2000) zu senden ??! Übrigens funktioniert das nicht zu setTimeout (alert ("test"), 2000) ...
Adler
2

Nun, Sie haben vielleicht die Antwort bekommen, aber ich erkläre die Ursache und Lösung. Es gibt zwei Möglichkeiten, wie Sie eine Funktion nach der erforderlichen Zeit aufrufen können.

1. setTimeout ("FUNC_NAME () ', TIME_IN_MS);
Hier ist FUNC_NAME in doppelten Anführungszeichen die ursprüngliche Funktion, die Sie nach Millisekunden TIME_IN_MS aufrufen möchten. Dies liegt daran, dass die Funktion ausgeführt wird, wenn Sie die Anführungszeichen nicht setzen, während das Java-Skript interpretiert wird sofort ausgeführt werden und Ihr Zweck würde
zunichte gemacht werden . Damit der Interpreter die Anweisung überspringen kann, müssen wir hier Anführungszeichen setzen. 2. setTimeout (function () {FUNC_NAME ()}, TIME_IN_MS);
Hier wird eine anonyme Funktion erstellt, die den Interpreter anweist , if auszuführen nach einer bestimmten Zeit statt Zeit auszuwerten.

Danke shaILU

shaILU
quelle
1

Entfernen Sie zuerst die Klammer:

setTimeout(testfunction, 2000);

Und dann, wenn Sie Parameter in setTimeoutFunktion übergeben möchten , können Sie auf folgende Weise übergeben:

 setTimeout(testfunction, 2000, param1, param2);

Hinweis: Sie können je nach Funktionsanforderung mehrere Parameter übergeben.

Shraddha
quelle
Vielen