2014-11-12 11 views
5

Perché restituisce 2 anziché 1? Sembra che la seconda "var" sia silenziosamente ignorata.javascript implementa lo scoping lessicale?

function foo() 
{ 
    var local = 1; 
    { 
    var local = 2; 
    } 
    return local; 
} 
foo() 
/* 
2 
*/ 
+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let –

risposta

3

Da the MDN:

JavaScript non ha blocchi ambito economico; piuttosto, una variabile dichiarata all'interno di un blocco è locale alla funzione (o all'ambito globale) che il blocco risiede all'interno.

L'ambito di una variabile in JavaScript è l'intera funzione in cui è dichiarata (o la portata globale), in modo da avere solo una variabile local qui.

Il codice è equivalente al

function foo() 
{ 
    var local; 
    local = 1; 
    { 
    local = 2; 
    } 
    return local; 
} 
foo() 

noti che ES6 (la nuova norma di JavaScript) non introdurre un lexical scoping with let ma it's not yet really available.

+0

È disponibile per l'armonia firefox e nodejs. – simonzack

+1

@simonzack Non hai notato che mi sono collegato al tavolo Kangax? A meno che OP non stia scrivendo sul server, non può permettersi di essere incompatibile con IE e Chrome, ecco perché ho detto "non proprio disponibile". –

+0

Ah, vedo, non ho fatto clic sul tuo link. – simonzack

5

In javascript è disponibile solo l'ambito del livello di funzione e l'ambito globale. non è possibile creare un ambito di blocco e non aggiunge alcun significato speciale e non crea alcun ambito.

e questo è come il codice finisce

function foo() 
{ 
    var local = 1; 
    local = 2; 
    return local; 
} 
foo(); 

In ES6 è possibile creare ambiti a livello di blocco con l'aiuto di Let. ES6 non è ancora supportato. più su quello here

+2

si dovrebbe notare che lo scope lessicale è in arrivo nel prossimo futuro con la parola chiave ES6 let. – Capaj