2016-01-21 15 views
5

Perché questo codice funziona?Stringa in esecuzione come funzione in javascript setTimeout?

setTimeout("document.body.innerHTML = 'TEST'", 1000)

non dovrebbe essere?

setTimeout(function() { 
    document.body.innerHTML = 'TEST' 
}, 1000) 

Come stringa setTimeout convertito per funzionare?

+3

Da [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout): * "il codice nella sintassi alternativa è ** una stringa di codice ** tu voglio eseguire dopo un ritardo di millisecondi (l'uso di questa sintassi non è raccomandato per gli stessi motivi dell'uso di 'eval()') "* –

+0

Un punto di vista correlato interessante [qui] (https://stackoverflow.com/q/3492015/465053). – RBT

risposta

6

Citando codice setTimeout documentation

di MDN nella sintassi alternativa è una stringa di codice che si desidera eseguire dopo millisecondi di ritardo (che utilizzano questa sintassi non è raccomandato per le stesse ragioni usando eval())

Come suggerito in MDN, è meglio evitare le stringhe nello setTimeout in quanto l'implementazione potrebbe richiedere la stringa eval.


Questo non è solo una cosa implementazione del browser, ma le specifiche HTML si definisce in questo modo in this section

handle = window . setTimeout(code [, timeout ]) 

Orari un timeout per compilare ed eseguire il codice dopo millisecondi di timeout.

1

Fondamentalmente la specifica gli consente di andare in entrambi i modi, quindi i browser lo prenderanno in entrambi i modi. Così semplice

Non consigliato perché utilizza eval sulla stringa. La via della funzione è il modo migliore.

2

documentazione per firefox , IE

E 'destinato comportamento: è possibile passare un puntatore a funzione o di una stringa come primo argomento.

Per quanto riguarda come funziona, JS è un linguaggio di scripting, quindi valutare una stringa su un codice interpretato (come fa eval) è ciò che è molto bravo in.

modifica: intendevo "molto bravo" nel contesto di un linguaggio di scripting, utilizzato per analizzare le stringhe sul codice di lavoro, come sottolinea Jimbo Jonny; è qualcosa da evitare.

+0

In realtà, la conversione di una stringa in codice è qualcosa che lo costringe a rinunciare a una serie di ottimizzazioni altrimenti vantaggiose, rallentando non solo quella linea, ma molte altre operazioni all'interno del codice. Non è qualcosa in cui è buono. In realtà è qualcosa che è molto povero e dovrebbe essere evitato dove possibile. –