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
*/
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
*/
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.
È disponibile per l'armonia firefox e nodejs. – simonzack
@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". –
Ah, vedo, non ho fatto clic sul tuo link. – simonzack
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
si dovrebbe notare che lo scope lessicale è in arrivo nel prossimo futuro con la parola chiave ES6 let. – Capaj
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let –