Warum wird der setInterval-Rückruf nur einmal ausgeführt?


71

Ich habe diesen Zähler, den ich gemacht habe, aber ich möchte, dass er für immer läuft. Es ist wirklich einfach. Was mache ich hier falsch?

function timer() {
  console.log("timer!")
}

window.setInterval(timer(), 1000)

8
Das Problem besteht darin, timer()das Funktionsobjekt aufzurufen, das sich aus der Auswertung timerergibt, und dann das Ergebnis ( undefined) an zu übergeben setTimeout. Rufen Sie es also nicht auf. setInterval(timer, 1000)

Antworten:


116

Sie haben einen Funktionsaufruf anstelle einer Funktionsreferenz als ersten Parameter des setInterval verwendet. Mach es so:

function timer() {
  console.log("timer!");
}

window.setInterval(timer, 1000);

Oder kürzer (aber wenn die Funktion größer wird, auch weniger lesbar):

window.setInterval( function() {
  console.log("timer!");
}, 1000)

3
Die Antwort weist richtig darauf hin, dass die Rückruffunktion nicht das "()" im Argument haben sollte.
Kristian

2
Laut developer.mozilla.org/en/Extensions/… kann die kürzere Version zu einem Speicherverlust führen.
Crend King

2
@CrendKing Beide Versionen haben genau das gleiche "Problem" (auch für Erweiterungen und haben keine Auswirkungen auf normale Webseiten / JS), da es auf die Objektlebensdauer ankommt.

Deshalb habe ich "darf" gesagt, da OP seinen Anwendungsfall nicht spezifiziert. Achten Sie nur darauf, ob es aus einer Mozilla-Erweiterung extrahiert wurde.
Crend King

1
Sie können nicht mit setInterval, aber Sie können dies mit der Funktion setTimeout nachahmen.
Koen Peters

11

setIntervalund setTimeout muss mit Rückrufen verwendet werden, wie:

setInterval(timer, 1000);

oder unbenannte Funktionen:

setInterval( function() { console.log("timer!"); }, 1000 );

Warum Ihr Code nicht funktioniert - wenn Sie eine Funktion als Argument an eine andere Funktion mit Klammern übergeben, z. B. übergeben doSomething ( someFunc() )Sie das Ergebnis der Funktion.

Wenn die Funktion als Objekt übergeben wird, übergeben doSomething ( someFunc )Sie z. B. einen Rückruf. Dieser Weg someFuncwird als Referenz übergeben und irgendwo in der aufrufenden Funktion ausgeführt. Dies entspricht den Zeigern auf Funktionen in anderen Sprachen.

Ein häufiger Fehler ist die Verwendung dieser beiden Funktionen, wie in w3schools gezeigt . Dies macht einen impliziten Aufruf an eval.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.