Javascript setInterval werkt niet

Ik moet elke 10 seconden een javascript-functie uitvoeren.

Ik begrijp dat de syntaxis als volgt moet werken, maar ik krijg geen succes:

function funcName() {
    alert("test");
}
var func = funcName();
var run = setInterval("func",10000)

Maar dit werkt niet. Hulp?


Antwoord 1, autoriteit 100%

Veel andere antwoorden zijn gericht op een patroon dat wel werkt, maar hun uitleg is niet echt heel grondig waarom uw huidige code niet werkt.

Uw code, ter referentie:

function funcName() {
    alert("test");
}
var func = funcName();
var run = setInterval("func",10000)

Laten we dit opdelen in stukjes. Je functie funcNameis prima. Merk op dat wanneer u funcNameaanroept (met andere woorden, u het uitvoert), u "test"waarschuwt. Maar merk op dat funcName()— de haakjes betekenen om de functie te “aanroepen” of “uit te voeren” — niet echt een waarde retourneert. Als een functie geen retourwaarde heeft, wordt deze standaard ingesteld op een waarde die bekend staat als undefined.

Als je een functie aanroept, voeg je de lijst met argumenten toe aan het einde tussen haakjes. Als je geen argumenten hebt om de functie door te geven, voeg je gewoon lege haakjes toe, zoals funcName(). Maar als u naar de functie zelf wilt verwijzen en deze niet wilt aanroepen, hebt u de haakjes niet nodig omdat de haakjes aangeven dat u deze wilt uitvoeren.

Dus, als je zegt:

var func = funcName();

Je declareert eigenlijk een variabele funcdie de waarde funcName()heeft. Maar let op de haakjes. funcName()is eigenlijk de retourwaarde van funcName. Zoals ik hierboven al zei, aangezien funcNameeigenlijk geen waarde retourneert, wordt het standaard ingesteld op undefined. Met andere woorden, uw variabele funczal in feite de waarde undefinedhebben.

Dan heb je deze regel:

var run = setInterval("func",10000)

De functie setIntervalheeft twee argumenten. De eerste is de functie die om de zoveel tijd moet worden uitgevoerd, en de tweede is het aantal milliseconden tussen elke keer dat de functie wordt uitgevoerd.

Echter, het eerste argument zou eigenlijk een functie moeten zijn, geen string. Als het een string is, gebruikt de JavaScript-engine in plaats daarvan evalvoor die string. Met andere woorden, uw setInterval voert de volgende JavaScript-code uit:

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

Echter, funcis slechts een variabele (met de waarde undefined, maar dat is niet relevant). Dus elke tien seconden evalueert de JS-engine de variabele funcen retourneert undefined. Maar dit slaat echt nergens op. Ik bedoel, het wordt technisch gezien elke 10 seconden geëvalueerd, maar je zult daar geen effecten van zien.

De oplossing is om setIntervaleen functie te geven om uit te voeren in plaats van een string. Dus in dit geval:

var run = setInterval(funcName, 10000);

Merk op dat ik het niet funcheb gegeven. Dit komt omdat funcgeeneen functie is in je code; het is de waarde undefined, omdat je het funcName()hebt toegewezen. Zoals ik hierboven al zei, zal funcName()de functie funcNameaanroepen en de geretourneerde waarde van de functie retourneren. Aangezien funcNameniets teruggeeft, is dit standaard undefined. Ik weet dat ik dat nu al verschillende keren heb gezegd, maar het is echt een heel belangrijk concept: als je funcName()ziet, zou je moeten denken aan “de geretourneerde waarde van funcName“. Als u naar een functie zelfwilt verwijzen, zoals een afzonderlijke entiteit, moet u de haakjes weglaten zodat u deze niet noemt: funcName.

Dus een andere oplossing voor uw code zou zijn:

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

Dat is echter een beetje overbodig: waarom funcgebruiken in plaats van funcName?

Of je kunt zo trouw mogelijk blijven aan de originele code door twee bits aan te passen:

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

In dit geval evalueert de JS-engine func()elke tien seconden. Met andere woorden, het zal om de tien seconden "test"waarschuwen. Echter, zoals de beroemde uitdrukking luidt, evalis slecht, dus je moet proberen het waar mogelijk te vermijden.

Een andere draai aan deze code is het gebruik van een anonieme functie. Met andere woorden, een functie die geen naam heeft — je laat hem gewoon in de code vallen omdat het je niet kan schelen hoe hij heet.

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

In dit geval, aangezien het me niet kan schelen hoe de functie wordt genoemd, laat ik daar gewoon een generieke, naamloze (anonieme) functie achter.


Antwoord 2, autoriteit 5%

Verander setInterval("func",10000)in setInterval(funcName, 10000)of setInterval("funcName()",10000). De eerste is de aanbevolen methode.


Antwoord 3, autoriteit 4%

Probeer dit:

function funcName() {
    alert("test");
}
var run = setInterval(funcName, 10000)

Antwoord 4, autoriteit 2%

Dat komt omdat je een functie moet doorgeven, geen string:

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

Uw code heeft twee problemen:

  • var func = funcName();roept de functie onmiddellijk aan en wijst de retourwaarde toe.
  • Alleen "func"is ongeldig, zelfs als u de slechte en verouderde eval-achtige syntaxis van setInterval gebruikt. Het zou setInterval("func()", 10000)zijn om de functie eval-like aan te roepen.

Other episodes