2013-11-01 23 views
63

Sono nuovo di Javascript e stavo facendo alcune pratiche sulla validità delle variabili locali e globali, che segue è il mio codice (fiddle):Javascript confusione variabile locale e globale

var myname = "initial" 
function c(){ 
    alert(myname); 
    var myname = "changed"; 
    alert(myname); 
} 
c(); 

quando il primo avviso viene chiamato, sta mostrando myname come non definito. quindi la mia confusione è il motivo per cui non sono in grado di accedere a un'istanza globale di myname e se non definisco myname all'interno della funzione, funzionerà correttamente.

+1

se fai ** alert (window.myname); ** allora otterrai i valori –

+0

@dholakiyaankit Ho provato a usare window.myname ancora sta dicendo indefinito ... –

+0

@BharatSoni window.myname funziona nel mio browser. – EmptyArsenal

risposta

6

Non sostituisce la variabile globale. Quello che sta accadendo è chiamato "sollevamento variabile". Cioè, var myname; viene inserito nella parte superiore della funzione. inizializzare sempre le variabili prima di usarli - provare questo:

var myname = "initial"; 
 

 
function c() { 
 
    alert(myname); 
 
    myname = "changed"; 
 
    alert(myname); 
 
} 
 

 
c();

+0

signore, non sto solo cercando di cambiare il valore .. quello che stai facendo è cambiare il valore della variabile globale stessa .. Voglio capire il concetto "PERCHE" sta succedendo ... –

+0

Questo risolve il problema di allertare indefinito, ma elimina qualsiasi variabile locale in quanto utilizza solo la variabile globale 'myname'. – EmptyArsenal

+0

Non sostituisce la variabile globale. Quello che sta accadendo è chiamato "sollevamento variabile". Cioè, myname var myname; viene inserito nella parte superiore della funzione. Inizializza sempre le tue variabili prima di usarle, puoi consultare questo http://stackoverflow.com/questions/11938961/understanding-global-local-scope-in-javascript?rq=1 –

42

in JavaScript, le dichiarazioni delle variabili vengono automaticamente spostati nella parte superiore della funzione. Quindi, l'interprete dovrebbe essere più simile a questo:

var myname = "initial" 
function c(){ 
    var myname; 
    // alerts undefined 
    alert(myname); 
    myname = "changed"; 
    // alerts changed 
    alert(myname); 
} 
c(); 

Questo è chiamato "sollevamento".

A causa del sollevamento e del fatto che l'ambito di qualsiasi variabile è la funzione in cui è dichiarato, è prassi comune elencare tutte le variabili nella parte superiore di una funzione per evitare questa confusione.

+0

che ho capito, quindi c'è ora modo per accedere a una variabile globale con lo stesso nome della variabile locale .. ?? –

+2

Dovresti essere in grado di accedervi facendo 'window.myname'. Vedi qui: http://stackoverflow.com/questions/15826751/access-overridden-global-variable-inside-a-function Ma le variabili globali non sono generalmente considerate una buona pratica e nella maggior parte dei casi sarebbe meglio definire un oggetto globale e accedervi attraverso questo. ad esempio 'var me = {myname:" initial "}' quindi chiama 'me.myname' nella funzione. – EmptyArsenal

+1

Non è corretto dire che la dichiarazione delle variabili viene spostata in alto. Per esempio se sulla riga 10 è scritto var myname = "initial", il risultato che vediamo non è come var myname = "initial" sulla riga 1, ma in realtà vediamo il comportamento come se var myname fosse on line 1 e on line 10 è assegnato valore ie myname = "initial" –

Problemi correlati