Javascript setInterval funktioniert nicht

Lesezeit: 5 Minuten

Javascript setInterval funktioniert nicht
mauzilla

Ich muss alle 10 Sekunden eine Javascript-Funktion ausführen.

Ich verstehe, dass die Syntax wie folgt funktionieren muss, aber ich bekomme keinen Erfolg:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

Aber das funktioniert nicht. Irgendeine Hilfe?

  • Es ist immer eine gute Idee zu sehen, was die Fehlerkonsole Ihres Browsers in diesen Situationen sagt.

    – Bojangles

    8. Januar 2012 um 18:03 Uhr

  • Weißt du, was passiert, wenn du passierst? "func" zu setInterval und welchen wert func hat? Es ist immer hilfreich zu lesen etwas Dokumentation.

    – Felix Klinge

    8. Januar 2012 um 18:10 Uhr


  • Übergeben einer Zeichenfolge an setInterval() (was normalerweise von vornherein eine schlechte Idee ist) bewirkt, dass es eine tut eval("func"). Das ist im Wesentlichen dasselbe wie eine Javascript-Zeile wie diese: func; was nichts bringt. Als String müssen Sie die Funktion like tatsächlich ausführen setInterval("func()", 10000)aber es ist viel besser, nur den eigentlichen Funktionsnamen wie zu übergeben setInterval(funcName, 10000) und zwingen Sie es niemals zur Verwendung eval() an erster Stelle.

    – jfriend00

    8. Januar 2012 um 18:13 Uhr


Viele andere Antworten konzentrieren sich auf ein Muster, das funktioniert, aber ihre Erklärungen sind nicht wirklich sehr gründlich, warum Ihr aktueller Code nicht funktioniert.

Ihr Code als Referenz:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

Lassen Sie uns das in Stücke aufteilen. Ihre Funktion funcName ist gut. Beachten Sie das, wenn Sie anrufen funcName (mit anderen Worten, Sie führen es aus) Sie werden alarmiert "test". Aber beachte das funcName() — die Klammern bedeuten, die Funktion “aufzurufen” oder “auszuführen” — gibt eigentlich keinen Wert zurück. Wenn eine Funktion keinen Rückgabewert hat, verwendet sie standardmäßig einen Wert, der als bekannt ist undefined.

Wenn Sie eine Funktion aufrufen, hängen Sie ihre Argumentliste in Klammern an das Ende an. Wenn Sie keine Argumente haben, um die Funktion zu übergeben, fügen Sie einfach leere Klammern hinzu, wie z funcName(). Wenn Sie jedoch auf die Funktion selbst verweisen und sie nicht aufrufen möchten, benötigen Sie die Klammern nicht, da die Klammern angeben, dass sie ausgeführt werden soll.

Also, wenn du sagst:

var func = funcName();

Du deklarierst eigentlich eine Variable func das hat einen wert von funcName(). Aber beachten Sie die Klammern. funcName() ist eigentlich der Rückgabewert von funcName. Wie ich oben sagte, seit funcName gibt eigentlich keinen Wert zurück, es ist standardmäßig undefined. Mit anderen Worten also Ihre Variable func wird tatsächlich den Wert haben undefined.

Dann hast du diese Zeile:

var run = setInterval("func",10000)

Die Funktion setInterval nimmt zwei Argumente. Die erste ist die Funktion, die von Zeit zu Zeit ausgeführt werden soll, und die zweite ist die Anzahl der Millisekunden zwischen jedem Ausführen der Funktion.

Das erste Argument sollte jedoch wirklich eine Funktion sein, kein String. Wenn es sich um eine Zeichenfolge handelt, verwendet die JavaScript-Engine eval stattdessen auf dieser Saite. Mit anderen Worten, Ihr setInterval führt also den folgenden JavaScript-Code aus:

func
// 10 seconds later....
func
// and so on

Aber, func ist nur eine Variable (mit dem Wert undefined, aber das ist irgendwie irrelevant). Alle zehn Sekunden wertet die JS-Engine die Variable aus func und kehrt zurück undefined. Aber das bringt nicht wirklich was. Ich meine, es wird technisch gesehen alle 10 Sekunden ausgewertet, aber Sie werden keine Auswirkungen davon sehen.

Die Lösung ist zu geben setInterval eine Funktion, die anstelle einer Zeichenfolge ausgeführt werden soll. Also in diesem Fall:

var run = setInterval(funcName, 10000);

Beachten Sie, dass ich es nicht gegeben habe func. Das ist weil func ist nicht eine Funktion in Ihrem Code; es ist der Wert undefinedweil Sie es zugewiesen haben funcName(). Wie ich oben sagte, funcName() ruft die Funktion auf funcName und gibt den Rückgabewert der Funktion zurück. Seit funcName gibt nichts zurück, dies ist standardmäßig auf undefined. Ich weiß, ich habe das jetzt schon mehrmals gesagt, aber es ist wirklich ein sehr wichtiges Konzept: wenn du siehst funcName()sollten Sie denken “der Rückgabewert von funcName“. Wenn Sie auf a verweisen möchten Funktion selbstwie bei einer separaten Entität, sollten Sie die Klammern weglassen, damit Sie sie nicht aufrufen: funcName.

Eine andere Lösung für Ihren Code wäre also:

var func = funcName;
var run = setInterval(func, 10000);

Das ist jedoch etwas überflüssig: warum verwenden func anstatt funcName?

Oder Sie können dem ursprünglichen Code so treu wie möglich bleiben, indem Sie zwei Bits ändern:

var func = funcName;
var run = setInterval("func()", 10000);

In diesem Fall wertet die JS-Engine aus func() alle zehn Sekunden. Mit anderen Worten, es wird alarmiert "test" alle zehn Sekunden. Doch wie der berühmte Satz sagt, eval ist bösealso sollten Sie versuchen, es nach Möglichkeit zu vermeiden.

Eine weitere Variante dieses Codes ist die Verwendung einer anonymen Funktion. Mit anderen Worten, eine Funktion, die keinen Namen hat – Sie fügen sie einfach in den Code ein, weil es Ihnen egal ist, wie sie heißt.

setInterval(function () {
    alert("test");
}, 10000);

Da es mir in diesem Fall egal ist, wie die Funktion heißt, lasse ich einfach eine generische, unbenannte (anonyme) Funktion dort.

  • Einerseits könnte ich zustimmen: In den vergangenen 8,5 Jahren habe ich versucht, mein Schreiben zu straffen. Auf der anderen Seite haben 117 Personen diese Antwort positiv bewertet.

    – Reid

    10. Juni 2020 um 20:50 Uhr

Ändern setInterval("func",10000) entweder setInterval(funcName, 10000) oder setInterval("funcName()",10000). Ersteres ist die empfohlene Methode.

Versuche dies:

function funcName() {
    alert("test");
}

var run = setInterval(funcName, 10000)

  • Stellen Sie sicher, dass Sie setzen funcName nicht funcName() im setInterval-Parameter

    – bedecko

    14. November 2018 um 18:20 Uhr


Javascript setInterval funktioniert nicht
DiebMeister

Das liegt daran, dass Sie eine Funktion übergeben sollten, keine Zeichenfolge:

function funcName() {
    alert("test");
}

setInterval(funcName, 10000);

Ihr Code hat zwei Probleme:

  • var func = funcName(); ruft die Funktion sofort auf und weist den Rückgabewert zu.
  • Nur "func" ist ungültig, selbst wenn Sie die schlechte und veraltete eval-ähnliche Syntax von setInterval verwenden. Es wäre setInterval("func()", 10000) um die Funktion eval-like aufzurufen.
996420cookie-checkJavascript setInterval funktioniert nicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy