Quando si definisce una variabile con var
, la dichiarazione della variabile viene "issata" nella parte superiore dell'ambito e pertanto la variabile viene definita per l'intero ambito. L'inizializzazione della variabile (assegnando il suo valore iniziale) rimane nella stessa posizione nel codice.
Quindi, nel secondo esempio, quando si esegue alert(box)
, la variabile box
è già stata dichiarata a causa dell'istruzione sollevata var
. Il tuo secondo esempio:
alert(box);
var box = "Thinking outside the box";
è sostanzialmente equivalente a questo (la dichiarazione della variabile box
viene issata alla cima del campo di applicazione):
var box;
alert(box);
box = "Thinking outside the box";
Questo rende la variabile box
dichiarato (anche se non inizializzato) prima dell'affermazione alert(box)
e quindi si ottiene un risultato coerente con la variabile dichiarata, ma senza valore (i report alert()
undefined
, ovvero ciò che accade quando la variabile esiste, ma non è ancora inizializzata).
tuo primo esempio non usa var
e quindi non v'è alcun modo di sollevamento nel punto in cui si fa alert(box)
, non v'è alcuna variabile a tutti di nome box
e quindi si ottiene il uncaught reference error
.
Ci sono molti, molti post qui su SO che descrivono i dettagli del sollevamento. Puoi visualizzarne un lungo elenco qui: https://stackoverflow.com/search?q=javascript+variable+hoisting dove troverai ulteriori spiegazioni sul sollevamento variabile.
Nota: le dichiarazioni di funzione vengono anche sollevate in modo che alcuni dei post che si trovano riguardino le dichiarazioni di funzione piuttosto che le dichiarazioni di variabili, sebbene il concetto sia praticamente lo stesso.
leggere su "sollevamento" – elclanrs
scatola chiamata, prima di aver definito scatola, che non esiste, esiste solo quando si definisce, se 'si' ha un valore oppure no. – saj
La tua comprensione è praticamente lì :) –