setTimeout () con stringa o riferimento alla funzione (anonima)? speedwise

Quale di questi due modi è più veloce e perché?

window.setTimeout("func()", 100); 

O

 window.setTimeout(function(){func();}, 100); 

Immagino che la seconda via sia più veloce se per nessun altro motivo tranne che per John Resig e tutti i ninja che la usano, suppongo che sia già stata analizzata al contrario del primo modo in cui avrebbe dovuto creare una nuova parodia “thingie” “. Ricordo vagamente che questo è uno dei motivi per cui alla gente non piace Eval ().

Anche se ti ho qui, nel secondo snipplet di codice, il primo punto e virgola è considerato una buona pratica in questo caso?

    C’è una terza opzione più veloce / semplice:

     window.setTimeout(func, 100); 

    … strettamente relativo alla tua domanda, il secondo è più veloce, in quanto è ancora un riferimento – non una valutazione, che è sempre abbastanza costosa. Per quanto riguarda il punto e virgola, sì, è una buona pratica usarli sempre. Non avrebbero mai dovuto essere IMO opzionali, ma molti non saranno d’accordo con me lì … ma non puoi davvero discutere contro l’esplicitazione nel tuo codice, è sempre una buona cosa.

    Come hai scritto, entrambi sono ugualmente “sicuri”. Il problema di sicurezza si presenta quando si tenta di passare argomenti, perché c’è la tentazione di fare cose del genere:

     setTimeout('func('+arg+')', 100); 

    Quale ha il potenziale per l’iniezione di codice. Qualcuno lo userà per distruggere la tua stella della morte. Prima o poi, un giovane jedi scoprirà come ingannare la tua app per rendere arg pari a 3.14); deathStar.selfDestruct( 3.14); deathStar.selfDestruct( , e la prossima cosa che sai, stai ricevendo una chiamata dall’Imperatore per spiegare il tuo errore.

    E potrebbe non essere tu a commettere l’errore … non faresti mai niente di così sciocco. Quando il tuo codice viene rifattorizzato 6 mesi dopo dal tirocinante e devono aggiungere un argomento, allora il problema si presenta.

    Quindi la forma della stringa è considerata una ctriggers pratica. È più lento e potenzialmente meno sicuro.

    L’uso di “setTimeout” con la syntax delle stringhe internamente rende il motore javascript “valido”. Ogni volta che il browser incontra un ‘eval’ in qualsiasi parte del codice, non può fare molte delle ottimizzazioni (e quindi disabilitarle) solo perché qualsiasi cosa può entrare in valutazione.

    Le ottimizzazioni come le variabili di cache non possono essere eseguite con ‘eval’ esistente nel codice perché ‘eval’ può introdurre nuove variabili che verranno ignorate durante la fase di compilazione di Javascript (dove rileva tutte le dichiarazioni).

    La seconda syntax è più veloce perché chiamerà la funzione dopo il ritardo e non entrerai nei mali di “eval”.

    Le persone che hai citato lo usano probabilmente non perché è più veloce.

    • codice nella syntax alternativa, è una stringa di codice che si desidera eseguire dopo i millisecondi di ritardo. (L’utilizzo di questa syntax non è raccomandato per gli stessi motivi dell’utilizzo di eval ())

    Da https://developer.mozilla.org/en/DOM/window.setTimeout

    Non credo che nessuno dei due sia misurabilmente più veloce nei browser moderni. Anche se uno fosse un po ‘più veloce, il semplice fatto che il tuo codice non chiamerà setTimeout troppo spesso rende il punto discutibile.

    Il primo ha il vantaggio di essere più leggibile e sarebbe la mia preferenza.