Wie kann ich sagen:
%Vor% Warum benötigt die Funktion in setTimeout
keine Klammer, aber die letzte Zeile?
myFunction
ist eine Funktion
myFunction()
ruft die Funktion auf und liefert den Wert, den die Funktion zurückgibt.
Der Zweck von setTimeout ist das Ausführen von Code nach einiger Zeit. Sie müssen nur die Funktion an sie übergeben (so kann setTimeout die Funktion selbst aufrufen, wenn dies angebracht ist), denn wenn Sie die Funktion (mit der Klammer) aufrufen, bevor sie an setTimeout übergeben wird, wird jetzt statt nach ausgeführt 1 Sekunde.
Die Funktion setTimeout
erwartet eine Funktionsreferenz * als Argument: Referenzen sind Variablen und haben keine Klammern.
Funktion Aufrufe erfordern Klammern (auch wenn die Funktion keine Parameter akzeptiert).
Kurzdarstellung: myFunction
ist eine Referenz auf die Funktion. myFunction()
führt die Funktion aus und "gleicht" in einem Ausdruck dem Rückgabewert der Funktion (oder undefined
, wenn nichts zurückgegeben wird).
Graben tiefer: Es gibt Situationen, in denen setTimeout(myFunction(), 1000)
Sinn macht, etwa wenn myFunction()
selbst eine Funktion zurückgibt. Zum Beispiel:
return
-Anweisung enthält) wird sofort ausgeführt. alert
enthält. Also:
myFunction
alone ist eine Referenz auf eine Funktion (die eine Funktion zurückgibt). myFunction()
wird ausgeführt. Es wird zu einer Funktionsreferenz ausgewertet, die für setTimeout()
geeignet ist. Schließlich:
%Vor% Dies ruft den Rückgabewert von myFunction()
in einer Sekunde auf. Eine Sekunde später gibt up die Warnung auf.
Siehe auch Warum benötigt die Funktionsanweisung einen Namen?
* Oder eine zu bewertende Zeichenfolge, aber eine Referenz wird bevorzugt.
Wenn Sie die Klammer verwenden, heißt es "rufen Sie diese Funktion jetzt auf". Wenn Sie also setTimeout(myFunction(),1000);
angeben, wird der Rückgabewert der Funktion als Rückruf für das Zeitlimit verwendet. Wenn der Rückgabewert für die Funktion selbst keine Funktion ist, erhalten Sie einen Fehler, weil sie versucht, etwas auszuführen, das nach dem Timeout nicht ausführbar ist (eine Zeichenfolge, eine Zahl, undefiniert usw.).
In Zeile 2 wird die Funktion myFunction
nicht aufgerufen, sondern als Argument an die Funktion setTimeout
übergeben, während in Zeile 4 myFunction
aufgerufen wird; Um eine Funktion aufzurufen, müssen Sie immer Klammern verwenden, auch wenn keine Argumente vorhanden sind.
Tags und Links javascript