2015-04-16 11 views
28

Non capisco completamente perché le seguenti schermate "vengano issate" verso la fine.Variabili JavaScript "issate"

var x = 'set'; 
var y = function() 
{ 
    // WHAT YOU DON'T SEE -> var x; 
    // is effectively "hoisted" to this line! 

    if (!x) 
    { 
     // You might expect the variable to be populated at this point...it is not 
     // though, so this block executes 
     var x = 'hoisted'; 
    } 

    alert(x); 
} 

//... and this call causes an alert to display "hoisted" 
y(); 

Qualsiasi suggerimento sarebbe apprezzato.

+0

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

+0

Sì, i parzializzatori' var x' nella parte superiore dello scope, questo è il comportamento normale della dichiarazione delle variabili in JS. – dfsq

+2

@ 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

risposta

33

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.

12

Dichiarazioni variabili sollevare la parte superiore dell'oscilloscopio. Pertanto il codice è equivalente alla presente:

var x = 'set'; 
var y = function() { 
    var x; 
    if (!x) { 
     x = 'hoisted'; 
    } 
    alert(x); 
} 

y(); 

Quando y viene eseguito, var x ombre ambito esterno x così all'interno della funzione xy è undefined dopo la prima riga della dichiarazione.

+0

come può ottenere il valore della variabile globale in funzione? – mhkyazd

+1

@mhkyazd utilizzando l'oggetto globale. – zerkms

+2

@mhkyazd semplicemente non scrive 'var x' ovunque nella funzione se' x' proviene da un ambito esterno, quindi non è sovrascritto. – floribon

2

this answer spiegare in modo molto dettagliato i diversi ambiti delle variabili. Nel tuo caso specifico puoi usare il riferimento a:

this.x; 

Per accedere alla variabile x globale al di fuori della funzione. Poiché all'interno della funzione si sta tentando di accedere a una variabile non definita, utilizzando la parola chiave this si fa riferimento a variabili esterne alla funzione.

E la parte di

if(!x) 

E 'vero, perché si sta testando: is false e x in quel punto è undefined perché non esiste nel campo di applicazione funzione e undefined è prendere in considerazione uno dei falsi valori di JS , per maggiori informazioni please take a look here.

+0

Si noti che l'uso di 'this' funziona solo nel caso specifico in cui' x' viene chiamato direttamente - se viene messo su un oggetto diverso allora 'this' non farà più riferimento all'oggetto globale. –

4

Haha il problema è che si sta creando la variabile x Ancora.

var x = 'set'; 
var y = function(){ 

if (!x) 
{ 
    // just use the = sign to update the value of it. 
    x = 'hoisted'; 

}; 
alert(x); 
}; 

y(); 
Problemi correlati