Javascript setInterval non funziona

È necessario per eseguire una funzione javascript ogni 10 secondi.

Ho capito la sintassi deve lavorare come seguire, ma non ottengo alcun successo:

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

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

Ma questo non funziona. Qualsiasi aiuto?

  • È sempre una buona idea per vedere che cosa il vostro browser della console di errore dice in queste situazioni.
  • Sai cosa succede quando si passa "func" per setInterval e che valore func ha? E ‘ sempre utile leggere documentazione.
  • Passando una stringa per setInterval() (che di solito è una cattiva idea, in primo luogo) induce a fare un eval("func"). Che è essenzialmente la stessa come una riga di codice javascript come questo: func; che non fa nulla. Come una stringa, è necessario eseguire la funzione come setInterval("func()", 10000), ma è molto meglio passare solo il nome effettivo della funzione come setInterval(funcName, 10000) e mai forzare l’utilizzo di eval(), in primo luogo.
InformationsquelleAutor mauzilla | 2012-01-08

 

4 Replies
  1. 108

    Un sacco di altre risposte sono concentrandosi su un modello che funziona, ma le loro spiegazioni non sono molto precisi, perché il vostro attuale codice non funziona.

    Codice di riferimento:

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

    Rompere in pezzi. La funzione funcName è bene. Nota che quando si chiama funcName (in altre parole, si esegue) sarà avvisi "test". Ma si noti che funcName() — la parentesi significa “chiamata” o “run”, la funzione — in realtà non restituiscono un valore. Quando una funzione non restituisce alcun valore, il valore predefinito è un valore noto come undefined.

    Quando si chiama una funzione, è possibile aggiungere la lista degli argomenti a termine in parentesi. Quando non hai argomenti da passare alla funzione, è sufficiente aggiungere le parentesi vuote, come funcName(). Ma quando si vuole fare riferimento alla funzione stessa, e non chiamarlo, non hai bisogno di parentesi, perché la parentesi indicano per eseguirlo.

    Così, quando si dice:

    var func = funcName();

    In realtà si sta dichiarando una variabile func che ha un valore di funcName(). Ma notare le parentesi. funcName() è in realtà il valore di ritorno di funcName. Come ho detto sopra, dal momento che funcName in realtà non restituisce alcun valore, il valore predefinito è undefined. Quindi, in altre parole, la variabile func in realtà avrà il valore undefined.

    Poi si dispone di questa linea:

    var run = setInterval("func",10000)

    La funzione setInterval prende due argomenti. La prima è la funzione di essere eseguito ogni tanto, e il secondo è il numero di millisecondi tra ogni volta che la funzione viene eseguito.

    Tuttavia, il primo argomento in realtà dovrebbe essere una funzione, non una stringa. Se è una stringa, quindi il motore JavaScript utilizzare eval sulla stringa, invece. Quindi, in altre parole, il setInterval è in esecuzione il seguente codice JavaScript:

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

    Tuttavia, func è solo una variabile con il valore undefined, ma questo è una specie di irrilevante). Così ogni dieci secondi, il JS motore restituisce la variabile func e restituisce undefined. Ma questa realtà non fare nulla. Voglio dire, tecnicamente è in corso di valutazione ogni 10 secondi, ma non si sta andando a vedere effetti che.

    La soluzione è dare setInterval una funzione per eseguire invece di una stringa. Quindi, in questo caso:

    var run = setInterval(funcName, 10000);

    Notare che non le ha dato func. Questo perché func è non una funzione nel codice; è il valore undefined, perché è stato assegnato funcName(). Come ho detto sopra, funcName() verrà chiamata la funzione funcName e restituire il valore di ritorno della funzione. Dal funcName non restituisce nulla, l’impostazione undefined. So che ho detto che diverse volte, ma è davvero un concetto molto importante: quando si vede funcName(), si dovrebbe pensare a “il valore di ritorno di funcName“. Quando si vuole fare riferimento a un funzione stessa, come un’entità separata, si dovrebbe lasciare fuori le parentesi così non chiamare: funcName.

    Quindi, un’altra soluzione per il tuo codice dovrebbe essere:

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

    Però, che è un po ‘ ridondante: perché usare func invece di funcName?

    O si può restare vero possibile all’originale, codice modificando due bit:

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

    In questo caso, il JS motore di valutare func() ogni dieci secondi. In altre parole, verrà inviato un avviso "test" ogni dieci secondi. Tuttavia, come la famosa frase va, eval è male, così si dovrebbe cercare di evitare, quando possibile.

    Un altro colpo di scena in questo codice, è possibile utilizzare una funzione anonima. In altre parole, una funzione che non ha un nome, è semplicemente cadere nel codice, perché non si cura di ciò che si chiama.

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

    In questo caso, perché non mi interessa quello che la funzione viene chiamata, mi basta lasciare un generico senza nome (anonimo) funzione.

    • Grazie per la tua risposta chiara!
  2. 6

    Cambiare setInterval("func",10000) a setInterval(funcName, 10000) o setInterval("funcName()",10000). Il primo è il metodo consigliato.

  3. 4

    Provare questo:

    function funcName() {
        alert("test");
    }
    
    var run = setInterval(funcName, 10000)
    • Assicurati di mettere il funcName non funcName() in setInterval parametro
  4. 3

    Che è perché si dovrebbe passare da una funzione, non una stringa:

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

    Del codice ha due problemi:

    • var func = funcName(); chiama la funzione immediatamente e assegna il valore di ritorno.
    • Solo "func" non è valido anche se si utilizza il brutto e obsoleto eval-come sintassi di setInterval. Sarebbe setInterval("func()", 10000) per chiamare la funzione eval-come.

Lascia un commento