2011-10-03 18 views
5

Non sono riuscito a trovare una corrispondenza esatta sul mio problema, sebbene esistano molte domande relative all'ambito del javascript. Ecco il mio codice attuale per la domanda.Confusione scoping Javascript

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    //var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

Quando eseguo questo, sono avvisati con "in bianco" e poi"uno" come previsto. Tuttavia, se disapprovo quella riga, così sembra.

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

sto avvisato con "in bianco" e quindi"in bianco". Questo non è quello che mi aspetterei e trovo confuso che l'aggiunta di una riga rimuova il comportamento. Qualcuno può spiegare cosa sta succedendo qui? Sto vedendo questo comportamento sia in firefox che in safari.

+0

Ancora un altro buon motivo per cui mai usare le variabili locali con lo stesso nome di variabili globali è solo in cerca di guai. – jfriend00

risposta

7

Tutte le dichiarazioni var sono effettivamente "issate" fino alla parte superiore della loro funzione di inclusione (sorta di). Quindi, il fatto che tu abbia var my_varovunque in quella funzione significa che tutte le menzioni di "my_var" si riferiscono alla variabile locale.

(ho detto "sorta di" perché la parte assegnazione della dichiarazione var non viene spostata, basta la dichiarazione che l'identificatore deve essere una variabile locale.)

+0

documenti? tutto ciò che conferma questo a parte l'esempio? – Neal

+0

Per finire la frase. Il sollevamento rende 'my_var' una variabile locale all'interno dell'intera funzione. – jfriend00

+0

Le specifiche lo rendono abbastanza chiaro. Sezione 12.2. Le specifiche parlano di variabili "create", e questa è la parte "sollevamento". – Pointy

3

La ragione è che le dichiarazioni vengono issate all'interno di un ambito della funzione in JavaScript. Maggiori informazioni a riguardo here.