2013-01-02 25 views
6

Sono in esecuzione in un problema ambito strano con JavaScript (vedi JSFiddle):Javascript problema portata variabile globale

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    var someGlobal = 5; 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Displays 3, why? 
    alert(someGlobal); 
} 

someF(); 
someF2(); 

Perché non Javascript tiri un problema indefinito in someF2()? Come mai someF2() non può accedere a someGlobal e someF() no? Come posso assicurarmi che una variabile globale sia accessibile in una funzione?

Nota:

In entrambi i casi, le funzioni iniziare chiamando alert(someglobal), perché una funzione buttare un problema indefinito e l'altro no?

risposta

7

someF crea una nuova variabile (localmente ambito) denominata someGlobal (che maschera il numero globale someGlobal) e assegna un valore ad esso. Non tocca il numero globale someGlobal (sebbene non possa accedervi perché esiste un'altra variabile con lo stesso nome in ambito).

var dichiarazioni sono issati, in modo someGlobal è mascherati per tutte di someF (non solo dopo la dichiarazione var). Il valore del locale someGlobal è undefined fino a quando non viene assegnato un valore.

someF2 accesso all'originale (non trattato) globale someGlobal.

+0

+1 per la risposta migliore ma descrive più che la variabile globale viene sovrascritta dalla variabile locale nella funzione: D –

+0

Non viene sovrascritta, viene mascherata. – Quentin

+0

bene puoi darmi una piccola spiegazione su entrambi! non ho fatto ricerche su di esso! Solo per quella funzione viene sovrascritta o no? –

4

Poiché si sta dichiarando una variabile locale con lo stesso nome. Quindi assegna il valore alla variabile locale. Basta rimuovere la var da var someGlobal in someF() e dovrebbe andare bene.

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    someGlobal = 5; // <-- orignially var someGlobal = 5 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Should display 5 now 
    alert(someGlobal); 
} 

someF(); 
someF2(); 
1

someF2 display 3 perché ancora è 3.

In SOMEF() si crea una nuova variabile che succede ad avere lo stesso nome di someGlobal. Questo non fa nulla all'originale someGlobal, crea semplicemente una nuova variabile localmente per funzionare con un po 'di F che va via quando termina quella funzione.

Quindi si hanno variabili locali (ad esempio create all'interno di someF con var) e globali.

+0

Ok, ma perché ottengo un problema definito in un caso e non l'altro? Questa è la mia domanda. – JVerstry

+0

Penso che Quentin abbia ora spiegato questo. –

-1

Ecco un esempio di come utilizzare la variabile locale e globale all'interno di someF utilizzando this.

var someGlobal = 3; 

function someF() { 

    // Displays 3 
    alert(someGlobal); 
    this.someGlobal = 5; 
    someGlobal = 5; 
    // Displays 5 
    alert(this.someGlobal); 
} 

function someF2() { 
    // Displays 5 
    alert(someGlobal); 
} 

someF(); 
someF2();