2010-10-26 13 views
19

Con gli oggetti in particolare, non capisco quali parti dell'oggetto vengono eseguite prima dell'inizializzazione, cosa viene eseguito durante l'inizializzazione e cosa viene eseguito in un secondo momento.In JavaScript, quale codice viene eseguito in fase di esecuzione e quale codice viene eseguito a parsetime?

EDIT: Sembra che parsetime sia la parola sbagliata. Credo che avrei dovuto formulare la domanda "Nella lettura in 2 passaggi, cosa viene letto il primo passaggio e cosa viene letto nel secondo passaggio?"

+0

Dipende dal vostro codice. – SLaks

+1

Quando chiedi informazioni su Javascript, ti riferisci in particolare ad esso utilizzato in un ambiente di browser web? – Spudley

+0

@Spudley, non sapevo che potesse essere usato in qualsiasi altro ambiente, quindi sì. – randomable

risposta

2

Diversamente da C++, non è possibile eseguire la logica nel parser Javascript.

Ho il sospetto che tu stia chiedendo quale codice viene eseguito immediatamente e quale codice viene eseguito quando crei ogni istanza di oggetto.

La risposta è che qualsiasi codice in una funzione chiamata viene eseguito solo quando si chiama la funzione, mentre qualsiasi codice esterno a una funzione verrà eseguito immediatamente.

+0

Esiste un modo per rendere una funzione in un oggetto che viene eseguito quando l'oggetto viene inizializzato? – randomable

+0

@Randomable: che tipo di oggetto? Puoi chiamare la funzione nel costruttore. – SLaks

+0

Ok, quindi devi chiamarlo? Non c'è sintassi della creazione di una funzione che la rende automatica? Penso che tu abbia inavvertitamente risposto alla mia domanda proprio allora. – randomable

3

Mentre l'antenato diretto di JavaScript è Scheme, JavaScript non ha ereditato le macro, quindi la risposta è abbastanza semplice: c'è mai alcun codice eseguito durante il tempo di analisi.

+0

Non intendi "Sé", non "Schema"? È da lì che ha ereditato il prototipo. In realtà non ha avuto molto da Scheme. – Pointy

25

Un file javascript viene eseguito in una lettura a 2 passaggi. Il primo passaggio analizza la sintassi e raccoglie le definizioni di funzione e il secondo passaggio esegue effettivamente il codice. Questo può essere visto notando che il seguente codice funziona:

foo(); 

function foo() { 
    return 5; 
} 

ma il seguente non lo fa

foo(); // ReferenceError: foo is not defined 

foo = function() { 
    return 5; 
} 

Tuttavia, questo non è davvero utile sapere, come non v'è alcuna esecuzione nel primo passaggio. Non è possibile utilizzare questa funzione per modificare la logica.

+3

È molto utile sapere perché potrei facilmente aver scritto il codice nel tuo secondo esempio e non ho capito perché non ha funzionato. Inoltre, non mi ero reso conto che non c'era esecuzione durante il primo passaggio, quindi stai definitivamente chiarendo le cose per me. – randomable

+0

@Gareth - che dire di var foo = function() {return 5;}) // undefined non è una funzione? –

+0

@GalMargalit No, si otterrà un errore di sintassi (parentesi aggiuntiva). Se stai parlando di un IIFE, otterrai un errore indefinito. Questo viene anche eseguito su runtime. – GuyT

4

Non so esattamente cosa chiedi, quindi condividerò solo quello che so.

Le funzioni JavaScript sono "pre-caricate" e memorizzate nella memoria del browser, il che significa che quando si ha la funzione dichiarata nella parte finale della pagina e il codice lo chiama all'inizio, funzionerà.

Si noti che le variabili globali, ovvero qualsiasi variabile assegnata all'esterno di una funzione, non sono precaricate, quindi possono essere utilizzate solo dopo essere state dichiarate.

Tutti i comandi esterni a una funzione verranno analizzati nell'ordine in cui appaiono.

JavaScript non ha realmente "runtime", può solo rispondere agli eventi o avere codice eseguito tramite timer globali. Qualsiasi altro codice verrà analizzato e "dimenticato".

+0

'Le variabili globali JavaScript, che significano qualsiasi variabile assegnata al di fuori di una funzione, sono anche precaricate e possono essere utilizzate dal codice in qualsiasi punto della pagina. possiamo usarlo prima che sia inizializzato, il modo in cui usiamo le funzioni del tempo di analisi cioè' function foo() {} '? penso che no .. le variabili globali possono essere usate solo dopo la sua inizializzazione. questo non funzionerà 'console.log (a); var a = 20; ' –

+0

@LalZada hmm ... Penso di averlo ricontrollato quando ho scritto questo, proverò di nuovo presto. –

+0

@LalZada beh, è ​​imbarazzante ... o JS è cambiato, o l'ho postato senza prima controllare. Modificato, grazie per il testa a testa! :) –

Problemi correlati