2009-12-11 15 views
8

So, ad esempio, che quando Chrome scarica un file Javascript, viene interpretato e JIT.JavaScript è analizzato/interpretato al caricamento? (IE)

La mia domanda è, quando IE6,7,8, per prima cosa scaricare un file Javascript, è l'intera cosa analizzata e interpretata?

La mia comprensione era che solo le firme delle funzioni di livello superiore e qualsiasi cosa eseguita nell'ambito globale è stata analizzata sul carico. E poi i corpi delle funzioni e il resto sono stati analizzati all'esecuzione.

Se sono completamente analizzati al momento del caricamento, quale pensi che sarebbe il risparmio di tempo nel differire i corpi delle funzioni da scaricare e analizzare in seguito?

+0

Piccola nitpick, ehm intendo correzione: V8 * mai * interpreta, * sempre * compila codice nativo. Non ha * nemmeno * un interprete, solo un compilatore di codice nativo. –

+0

@ Jörg W Mittag Sì, stavo tracciando i termini, suppongo: analizzare/interpretare/eseguire. Questi due sono essenzialmente gli stessi: interpret/execute – Adam

risposta

2

Sì, su tutti i browser il download della risorsa blocca tutto il resto della pagina (download CSS, altro download JS, rendering) se eseguito con un tag <script>.

Se si sta caricando tutto il javascript all'inizio o all'interno della pagina, si vedranno singhiozzo come una richiesta di circa 50 ms e l'analisi per un file di libreria o qualcosa di simile potrebbe essere più di 100 ms. 100 ms è usato come standard per il quale qualsiasi cosa più grande sarà notata come "lag" dall'utente.

Il risparmio di tempo può essere trascurabile, ma la leggera perdita di esperienza dell'utente in caso di pause durante il caricamento della pagina può essere significativa a seconda della situazione.

Vedere LABjs' site per molti articoli e grandi spiegazioni sui vantaggi del differimento del caricamento e dell'analisi.

5

Sono completamente analizzati al caricamento. (IE deve analizzare lo script per sapere dove finisce il corpo di ogni funzione, ovviamente.) Nelle implementazioni open-source, ogni funzione è compilata in bytecode o anche in codice macchina allo stesso tempo, e immagino che IE funzioni allo stesso modo .

Se si dispone di una pagina che in realtà si carica troppo lentamente e si può rinviare il caricamento di 100 K di script che probabilmente non si utilizzerà, potrebbe essere utile per i tempi di caricamento. O non-vedi l'aggiornamento qui sotto.

(Curiosità:. Benchmark JS come SunSpider generalmente non misurano il tempo necessario per analizzare e compilare il codice)

UPDATE - da quando ho postato questa risposta, le cose sono cambiate! Le implementazioni analizzano comunque ogni script al caricamento almeno a sufficienza per rilevare eventuali SyntaxErrors, come richiesto dallo standard. Ma a volte differiscono le funzioni di compilazione finché non vengono chiamate per la prima volta.

+0

Puoi condividere qualsiasi fonte per il tuo aggiornamento? –

+1

[Il codice sorgente di SpiderMonkey è qui] (http://hg.mozilla.org/mozilla-central/file/tip/js/src/). Si noti che la classe Parser è un modello che può produrre un AST, per la compilazione immediata ('Parser ') o solo rilevare errori di sintassi ('Parser '). Quando una funzione che non è stata compilata viene richiamata in fase di esecuzione, viene chiamato 'js :: frontend :: CompileLazyFunction'. –

+0

Ah, grazie signore! –

3

Poiché la definizione di una funzione è in realtà un'operazione, sì, viene analizzato l'intero file javascript e tutte le operazioni di livello superiore vengono interpretate. Il codice all'interno delle tue funzioni non viene effettivamente eseguito finché non viene chiamato, ma viene analizzato.

ad esempio:

var i=0; 
var print = function(a) { 
    document.getElementById('foo').innerHtml = a; 
} 

Tutto viene analizzato nell'esempio di cui sopra, e le linee 1 e 2 vengono eseguiti. Tuttavia, la riga 3 non viene eseguita fino a quando non viene chiamata.

Ci sono pochi "giochi percettivi" che puoi giocare con i tuoi utenti, come mettere i tag di script nella parte inferiore dell'HTML anziché nella parte superiore, in modo che il browser esegua il rendering della parte superiore della pagina prima di ricevere il istruzioni per scaricare e analizzare il javascript. Probabilmente potresti anche spingere le tue definizioni di funzione in un documento.funzione onload, in modo che non vengano eseguiti fino a quando non viene caricata l'intera pagina e in memoria. Tuttavia, questo potrebbe causare un "lampo di contenuto inascoltato" se il tuo javascript sta applicando stili visivi a cose (come materiale dell'interfaccia utente di jQuery).

+0

interpretato, vuoi dire che sono eseguiti? – Adam

+0

Sì. Non credo che internet explorer sia un jolly. –

+0

Questo è interessante se è corretto. Penserei che farebbero un po 'di jogging solo per motivi di prestazioni la prossima volta che viene chiamata una funzione. Immagino che l'idea che la pura interpretazione sia lenta è una nozione antiquata. – ChrisDiRulli

1

Cosa intendi per "download"? Quando è incluso nel tag o quando viene scaricato tramite XMLHttpRequest?

Se si intende l'inclusione per script, quindi IE interpreta tutti i file js contemporaneamente. Altrimenti non sarai in grado di chiamare le funzioni in quel file o vedere il messaggio di errore di sintassi.

Se si intende scaricare da XMLHttpRequest, quindi è necessario valutare il contenuto del file da soli.

+0

Voglio dire usare un tag script – Adam

Problemi correlati