Wenn ich eine benannte Funktion mit setTimeout () und setInterval () ohne Klammern aufrufe, funktioniert dies wie erwartet. Wenn ich dieselbe Funktion mit den Klammern aufrufe, wird sie entweder sofort ausgeführt oder es wird ein Fehler ausgegeben.

Ich suche ein tieferes Verständnis in dieser Angelegenheit als das, was ich im Internet gefunden habe. Würdet ihr mir bitte erklären, warum das so ist?

var func = function(){
    console.log("Bowties are cool.");
}

setTimeout(func(), 1500);
// Prints "Bowties are cool." immediately

setInterval(func(), 1500);
// Throws an error

setInterval(func, 1500);
// Works as expected

setTimeout(console.log("Bowties are cool."),1500);
// This method has the same result as "setTimeout(func(), 1500)".
5
sufuninja 21 Aug. 2015 im 19:30

3 Antworten

Beste Antwort

Sie müssen einen Funktionsverweis sowohl auf setTimeout() als auch auf setInterval() übergeben. Das heißt, Sie übergeben einen Funktionsnamen ohne das () oder eine anonyme Funktion.

Wenn Sie das () nach dem Funktionsnamen wie in func() einfügen, führen Sie die Funktion sofort aus und übergeben das Rückgabeergebnis an setInterval() oder an setTimeout(). Wenn die Funktion selbst keine andere Funktionsreferenz zurückgibt, wird dies niemals das tun, was Sie wollen. Dies ist ein sehr häufiger Fehler für Javascript-Programmierer (ich habe den gleichen Fehler selbst beim Erlernen der Sprache gemacht).

Der richtige Code lautet also:

setTimeout(func, 1500);
setInterval(func, 1500);

Wenn Sie andere Sprachen kennen, die Zeiger verwenden, können Sie sich den Namen einer Funktion mit dem () als Zeiger auf die Funktion vorstellen. Dies ist eine Funktionsreferenz in Javascript, die Sie an a übergeben Funktion, wenn Sie möchten, dass eine Funktion später und nicht sofort ausgeführt werden kann.


Wenn Sie dies versehentlich tun:

setTimeout(func(), 1500);
setInterval(func(), 1500);

Es führt Ihr func() sofort aus und übergibt dann das Rückgabeergebnis an setTimeout() und setInterval(). Da Ihr func() nichts zurückgibt, tun Sie im Wesentlichen Folgendes:

func();
setTimeout(undefined, 1500);

Welches ist, was Sie beobachten, aber nicht was Sie wollen.


Wenn Sie einen bestimmten Funktionsaufruf wie console.log("Bowties are cool.") ausführen möchten, können Sie ihn in eine andere Funktion wie die folgende einschließen:

setTimeout(function() {
    console.log("Bowties are cool.")
}, 1500);

Sie übergeben also wieder einen Funktionsverweis auf setTimeout(), der SPÄTER ausgeführt werden kann, anstatt ihn sofort auszuführen, was Sie getan haben.

5
jfriend00 21 Aug. 2015 im 16:44

SetTimeout und setInterval erwarten, dass eine Funktion reference an sie übergeben wird. Sie sollten die Funktion nicht innerhalb der Aufrufe setTimeout und setInterval aufrufen.

Falsch ( TUN SIE DAS NICHT ):

setTimeout(func(), 1500);
setInterval(func(), 1500);
setTimeout(console.log("Bowties are cool."), 1500);
setInterval(console.log("Bowties are cool."), 1500);

Richtig:

setTimeout(func, 1500);
setInterval(func, 1500);
setTimeout(function() {
    console.log("Bowties are cool.");
}, 1500);
setInterval(function() {
    console.log("Bowties are cool.");
}, 1500);

Beachten Sie, wie ich das console.log in eine anonyme Funktion eingeschlossen habe, um es mit setInterval und setTimeout zu verwenden. Ich konnte console.log nicht an die Funktionen setInterval und setTimeout übergeben, da der Parameter "Bowties are cool." benötigt wird. Das Einschließen in die anonyme Funktion löst dieses Problem.

0
Jake Griffin 21 Aug. 2015 im 16:35

Wenn Sie nach einer definierten Funktion Klammern hinzufügen, rufen Sie die Funktion tatsächlich auf oder rufen sie auf.

Wenn Sie jedoch eine Funktion als Parameter in einer anderen Funktion übergeben, möchten Sie die Funktion nicht aufrufen, sondern nur einen Verweis auf diese Funktion als Parameter übergeben (und die Funktion, die Sie übergeben haben, steht zur Verfügung bei Bedarf angerufen).

Weitere Informationen zu Rückruffunktionen im Allgemeinen finden Sie unter hier.

0
Shimon Brandsdorfer 21 Aug. 2015 im 16:36