2012-07-09 15 views
7
frammento di

Per questo frammento di codice, Non mi sorprende variabile globale 'a' viene valutata per essere 5.Perplesso da questo codice JavaScript

http://jsfiddle.net/MeiJsVa23/gZSxY/:

var a = 10; 

function func(){ 
    a = 5; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // and this prints out 5 as expected. No surprise here. 
​ 

Ma come mai di questo frammento di codice, globale la variabile 'a' valuta essere 10 e non 5? È come se lo a = 5 non fosse mai successo.

http://jsfiddle.net/MeiJsVa23/2WZ7w/:

var a = 10; 

function func(){ 
    a = 5; 
    var a = 23; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // but this prints out 10!! why? 

+0

Wow, penso che la tua domanda abbia avuto risposta;) – mplungjan

risposta

0

Il var a nella funzione viene issato in cima all'ambito della funzione, quindi è la variabile locale che viene modificata, non quella globale.

0

Questo ha a che fare con il sollevamento .

Nella funzione viene dichiarata una variabile locale con lo stesso nome. Anche se accade dopo la tua modifica, si presume che sia stato dichiarato prima - si chiama sollevamento.

Variabile locale di sollevamento per dichiarazione ma non valore. Quindi:

function someFunc() { 
    alert(localVar); //undefined 
    var localVar = 5; 
} 

funzioni, se dichiarato con function name() {... sintassi, paranco sia per la dichiarazione e valore.

function someFunc() { 
    alert(someInnerFunc()); //5 
    function someInnerFunc() { return 5; } 
} 
0
var a = 10; //a is 10 

function func(){ 
    a = 5; //a is 5 
    var a = 23; // a is now in local scope (via hoisting) and is 23 
} 

func(); 

alert(a); // prints global a = 10 
1

Questo si chiama "variable hoisting". Le dichiarazioni var (e le dichiarazioni function()) vengono spostate nella parte superiore del loro ambito.

0

Presumibilmente, la dichiarazione var a = 23 crea una variabile locale per l'intero ambito. Quindi il globale a è in ombra per l'insieme di func(), non solo per le righe sotto l'istruzione. Quindi nel secondo frammento, a = 5 si assegna alla variabile locale dichiarata di seguito.

2

Quindi, ci sono due cose che stanno andando qui: hoisting e shadowing.

perché la prima, dichiarazioni di variabili sono "issato" verso l'alto, in modo che il codice è equivalente a:

var a = 10; 

function func(){ 
    var a; 
    a = 5; 
    a = 23; 
} 

E poiché il secondo, si è "in ombra" la variabile globale a con uno locale, quindi le modifiche non si riflettono sul globale a.

+0

+1 per l'esempio e preoccuparsi di spiegare cosa significa sollevare. –