function() {
var foo;
}
Come lei ha ricordato, foo
è disponibile nella LexicalEnvironment
è globale a tutte le funzioni interne all'interno di quella funzione.
Ma
function() {
{
let foo; // How does this affect the LexicalEnviroinment?
}
}
Qui foo
è locale al solo quel blocco. Non sarà visibile al di fuori di quel blocco.
In che modo ha effetto sullo LexicalEnvironment
?
Se si fa riferimento, foo
in qualsiasi punto all'interno di tale blocco, il locale let foo
sostituirà il valore globale var foo
definito in quella funzione.
Rispetto a ES6,
function example(x) {
console.log(y); // ReferenceError: y is not defined
if (x) {
let y = 5;
}
}
variabili dichiarate con un'istruzione let
vengono creati come binding sull'ambiente lessicale, piuttosto che la variabile di ambiente, del contesto di esecuzione corrente. Una modifica alle specifiche delle istruzioni di blocco in ES6 significa che ogni blocco ha il proprio ambiente lessicale. Nell'esempio precedente, viene creato un nuovo ambiente lessicale quando viene valutato il blocco (il corpo dell'istruzione if). Quando viene valutata l'istruzione let viene aggiunto un legame a questo ambiente lessicale ed è innaccessibile dall'ambiente lessicale esterno (quello della dichiarazione della funzione stessa).
Refer
Quindi, in ES6, i blocchi possono introdurre nuovi 'LexicalEnvironment's? O c'è un cambiamento in modo che un 'LexicalEnvironment' possa avere più di uno' [[Scope]] '? – Ben
'LexicalEnvironment' avrà più di un' [[ambito]] 'basato sul contesto. – mohamedrias
... che è un cambiamento da ES5? – Ben