2012-04-16 10 views
46

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?setInterval Callback läuft nur einmal

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

window.setInterval(timer(), 1000) 
+6

Das Problem ist 'timer()' ruft das Funktionsobjekt auf, das aus der Auswertung von 'timer' resultiert und gibt dann das Ergebnis (' undefined') an 'setTimeout'. Also, rufe es nicht auf. Übergeben Sie stattdessen einfach das Funktionsobjekt: 'setInterval (timer, 1000)' –

Antwort

76

Sie haben einen Funktionsaufruf anstelle einer Funktionsreferenz als ersten Parameter von setInterval verwendet. Machen Sie es wie folgt aus:

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

window.setInterval(timer, 1000); 

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

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

Die Antwort weist richtig darauf hin, dass die Callback-Funktion nicht das "()" im Argument haben sollte. – Kristian

+2

Laut https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout kann die kürzere Version Speicherverlust verursachen. –

+0

nach Link von Crend King, Mozilla saugt. – nothrow

8

setInterval und setTimeoutmüssen mit Rückrufe 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. doSomething (someFunc()) Sie übergeben das Ergebnis der Funktion.

Wenn die Funktion als Objekt übergeben wird, z. doSomething (someFunc) Sie übergeben einen Rückruf. Auf diese Weise wird someFunc als Referenz übergeben und irgendwo in der aufrufenden Funktion ausgeführt. Dies entspricht den Hinweisen auf Funktionen in anderen Sprachen.

Ein häufiger Fehler ist die Verwendung dieser beiden Funktionen wie unter w3schools gezeigt. Dies führt zu einem impliziten Aufruf an eval.

Verwandte Themen