I ECMAScript 5 spec indica:JavaScript portata clausola catch
solito un ambiente lessicale è associato con alcuni specifici struttura sintattica di codice ECMAScript come un FunctionDeclaration, un WithStatement, o una clausola cattura di un TryStatement e un nuovo ambiente Lexical viene creato ogni volta che tale codice viene valutato.
Se la mia comprensione è corretta, poi, quando un nuovo ambiente lessicale viene creato in JavaScript, viene inserito un nuovo ambito, che è il motivo per cui le variabili dichiarate all'interno di una funzione non sono visibili al di fuori di quella funzione:
function example() {
var x = 10;
console.log(x); //10
}
console.log(x); //ReferenceError
Pertanto, nella dichiarazione di funzione sopra descritta, viene creato un nuovo ambiente lessicale, il che significa che x
non è disponibile in alcun ambiente Lexical esterno che possa esistere.
Quindi la parte della citazione sopra relativa alle dichiarazioni di funzione sembra avere un senso. Tuttavia, si afferma anche che un nuovo ambiente lessicale viene creato per la clausola catch di un'istruzione try:
try {
console.log(y); //ReferenceError so we enter catch
}
catch(e) {
var x = 10;
console.log(x); //10
}
console.log(x); //10 - but why is x in scope?
Così come fa la portata di un'opera catch
blocco? Ho un malinteso fondamentale su cosa sia un ambiente lessicale?
Questo post SO è in qualche modo correlato: http://stackoverflow.com/questions/6100230/javascript-catch-parameter-already-defined – Juri