Citando MDN Docs on var
hoisting,
Poiché dichiarazioni di variabili (e le dichiarazioni in generale) vengono elaborati prima dell'esecuzione qualsiasi codice, dichiara una variabile all'interno del codice è equivalente a dichiarare al vertice. Questo significa anche che una variabile può sembrare essere usata prima che sia dichiarata. Questo comportamento è chiamato "sollevamento", in quanto sembra che la dichiarazione della variabile venga spostata all'inizio della funzione o del codice globale.
Quindi, nel tuo caso, JavaScript sa che una variabile locale (non quella dichiarata al di fuori)x
è definito da qualche parte nella funzione, ma non conosce il valore effettivo di esso fino a quando l'esecuzione raggiunge un dichiarazione di assegnazione che assegna a x
. (Le dichiarazioni vengono elaborate durante il periodo di compilazione e le assegnazioni vengono eseguite nei tempi di esecuzione) Fino a quando l'assegnazione è terminata, verrà utilizzato il valore predefinito undefined
. Dal undefined
is falsy, la condizione
if (!x) {
è soddisfatto e viene eseguita l'istruzione di assegnazione. Questo è il motivo per cui ricevi hoisted
nella finestra di avviso.
Diciamo che non hanno dichiarato x
all'interno della funzione,
var x;
var y = function() {
if (!x) {
x = 'hoisted';
}
alert(x);
}
y();
alert(x);
Qui, dal momento che x
non è dichiarato in qualsiasi punto all'interno della funzione, in fase di esecuzione, JavaScript cercherà x
negli ambiti più elevati. In questo caso, lo trova giusto al di fuori della funzione. Pertanto, verrà utilizzato il valore x
. Poiché hai assegnato hoisted
a x
, il numero interno alert
dirà anche hoisted
e dopo aver lasciato la funzione, alert(x)
avviserà anche hoisted
.
equivale a 'var y = function() {var x; ... ', che lascia' x' locale nella funzione e non assegnato. se i blocchi non "si fermano" 'var' dal sollevamento – dandavis
Sì, i parzializzatori' var x' nella parte superiore dello scope, questo è il comportamento normale della dichiarazione delle variabili in JS. – dfsq
@ Qantas94Heavy: questo potrebbe effettivamente diventare un buon duplicato canonico per il sollevamento variabile, anche se attualmente non ne abbiamo uno. Solo per [funzione di sollevamento] (http://stackoverflow.com/q/7506844/1048572) ... – Bergi