Ho appena appreso un fatto importante sull'esecuzione di javascript in caso di errore. Prima di iniziare a trarre conclusioni su questo, è meglio verificare se ho ragione.Parte JavaScript eseguita o non eseguita se lo script precedente non riesce
Data una pagina HTML di cui 2 script:
<script src="script1.js" />
<script src="script2.js" />
script1:
doSomething();
SCRIPT2:
doSomeOtherThing();
Ciò si traduce in modo efficace in un singolo script in fase di elaborazione come una sola unità:
doSomething();
doSomeOtherThing();
In particolare, se doSomething
genera un errore, l'esecuzione è interrotta. 'script2' non viene mai eseguito.
Questa è la mia "Lezione 1" - si potrebbe pensare che poiché è un file incluso separatamente non è interessato da script1.
Ma lo è.
=> vedi "ritardo aggiornamento" al di sotto
Ora, se noi cambiare SCRIPT2 come segue (presumere di essere jQuery incluso da qualche parte sopra):
$(document).ready({ doSomeOtherThing(); });
e posizionare lo script prima SCRIPT2:
<script src="script2.js" />
<script src="script1.js" />
L'ordine di esecuzione è efficace ancora 'doSomething()' seguita (talvolta) di 'doSomeOtherThing()'.
Tuttavia è eseguito in due "unità":
doSomething
viene eseguito in anticipo come parte di java script del documentodoSomeOtherThing
viene eseguito quando l'evento document.ready viene elaborato.
Se doSomeOtherThing
genera un'eccezione, sarà non rompere la seconda trasformazione "unità".
(. Evito di usare il termine thread
perché mi sa che tutto lo script è di solito eseguito dallo stesso filo, o più precisamente questo può dipendere dal browser)
Quindi, il mio lession 2: Anche sebbene un errore JavaScript possa impedire l'esecuzione di script successivi, non interrompe il ciclo degli eventi.
Conclusione 1
$(document).ready()
fa un grande lavoro nel definire pezzi di codice JavaScript che dovrebbero essere eseguiti indipendente su tutti gli altri script nel riuscire.
O, in altre parole: se si dispone di un pezzo di JavaScript e si desidera assicurarsi che venga eseguito anche se altri script falliscono, posizionarlo all'interno di un $(document).ready()
.
Questo sarebbe nuovo per me in quanto avrei usato l'evento solo se lo script dipende dal caricamento completo del documento.
Conclusione 2
Facendo un ulteriore passo avanti che potrebbe essere una buona architettura decisione di avvolgere tutti script all'interno di un $(document).ready()
per assicurarsi che tutti gli script sono "in coda" per l'esecuzione. Nel secondo esempio, se è stato incluso script2.js
doposcript1.js
come nell'esempio 1:
<script src="script1.js" />
<script src="script2.js" />
un errore in script1.js impedirebbe il doSomeOtherThing()
da anche essere registrati, poiché la funzione $(document).ready()
non sarebbe eseguita.
Tuttavia, se script1.js usati $(document).ready()
, anche, che non sarebbe accaduto: sarebbero stati giustiziati
$(document).ready(function() { doSomething(); });
$(document).ready(function() { doSomeOtherThing(); });
Entrambe le linee. Successivamente, il ciclo degli eventi eseguirà doSomething
, che si interromperà, ma non verrà modificato 10.
Un motivo in più per farlo sarebbe che il thread che rende la pagina possa tornare al più presto possibile e che il ciclo di eventi possa essere utilizzato per attivare l'esecuzione del codice.
Critica/Domande:
- mi sono sbagliato?
- Quali motivi ci sono che rendono necessario l'esecuzione di un pezzo di codice immediatamente, vale a dire non lo avvolge nell'evento?
- Inciderebbe in modo significativo sulle prestazioni?
- C'è un altro/modo migliore per ottenere lo stesso piuttosto che utilizzare l'evento pronto per il documento?
- È possibile definire l'ordine di esecuzione degli script se tutti gli script registrano il loro codice come gestore di eventi? I gestori di eventi vengono eseguiti nell'ordine in cui sono stati registrati?
In attesa di eventuali commenti utili!
Aggiornamento tardiva:
Come Briguy37 rilevare correttamente, la mia osservazione deve essere stato sbagliato, in primo luogo. ("Mi sono sbagliato - sì!"). Prendendo il suo semplice esempio, posso riprodurlo in tutti i principali browser e persino in IE8, script2 viene eseguito anche se script1 genera un errore.
Ancora @ La grande risposta di Marcello consente di avere un'idea dei concetti di stack di esecuzione, ecc. Sembra proprio che ciascuno dei due script sia eseguito in uno stack di esecuzione separato.
Grazie per tutte le vostre scoperte. Molto molto utile leggere +1 –
@Beto - grazie per l'upvote. Sfortunatamente la mia osservazione è stata smentita. Ho aggiornato la mia domanda e la risposta accettata ora. Sentiti libero di ritirare l'upvote. – chiccodoro
Ciao @chiccodoro! Ho letto il tuo post come inizio, poi ho letto tutte le risposte. Non tutte le tue scoperte erano sbagliate e mi aiutano in qualche modo a capire meglio le altre risposte che sono più tecniche. Quindi grazie comunque! –