È necessario passare una funzione di riferimento sia setTimeout()
e setInterval()
. Ciò significa che si passa un nome di funzione senza lo ()
dopo di esso o si passa una funzione anonima.
Quando si include l'()
dopo il nome della funzione come in func()
, si sta eseguendo la funzione immediatamente e poi passando il risultato ritorno alla setInterval()
oa setTimeout()
. A meno che la funzione stessa non restituisca un altro riferimento alla funzione, questo non farà mai ciò che vuoi. Questo è un errore molto comune per i programmatori Javascript (ho fatto lo stesso errore io stesso quando ho imparato la lingua).
Quindi, il codice corretto è:
setTimeout(func, 1500);
setInterval(func, 1500);
Se conoscete altre lingue che usano i puntatori, si può pensare al nome di una funzione con il ()
dopo che è come come un puntatore alla funzione e che è quale riferimento di funzione è in Javascript e questo è ciò che si passa a una funzione quando si desidera che sia in grado di eseguire alcune funzioni in un secondo momento, non immediatamente.
Quando si esegue questa operazione erroneamente:
setTimeout(func(), 1500);
setInterval(func(), 1500);
Si sta eseguendo il tuo func()
immediatamente e poi passando il risultato ritorno alla setTimeout()
e setInterval()
. Dal momento che il func()
non restituisce nulla, si sono essenzialmente facendo questo:
func();
setTimeout(undefined, 1500);
che è ciò che si osserva accadendo, ma non quello che volete.
Inoltre, se si desidera eseguire una funzione specifica chiamata come console.log("Bowties are cool.")
, allora si può avvolgerlo in un'altra funzione come questa:
setTimeout(function() {
console.log("Bowties are cool.")
}, 1500);
Quindi, ancora una volta si passa un riferimento funzione per setTimeout()
che può essere eseguito più tardi anziché eseguirlo immediatamente, il che è ciò che stavi facendo.
L'operatore '()' fa chiamare la funzione, così quando si usa 'func()' nella chiamata a 'setTimeout()' la funzione viene chiamata e il * risultato * (il valore di ritorno) viene passato per 'setTimeout()'. – Pointy
Si suppone che si passi una funzione, non il risultato di una funzione (a meno che non restituisca una funzione) - quindi è sorprendente che non funzioni? –
Le funzioni sono cittadini di prima classe in javascript. Puoi passare in giro come qualsiasi altra variabile. Quando si utilizza solo il nome di una funzione, si passa un riferimento alla funzione. Quando usi parentesi '()' stai chiamando la funzione e passa il * risultato * di quella chiamata. –