Спецификация ECMAScript 5 содержит следующее:
Обычно Лексическая среда связана с некоторыми конкретными синтаксическую структуру кода ECMAScript, такую как FunctionDeclaration, WithStatement или предложение Catch для TryStatement и новый Lexical Окружающая среда создается каждый раз, когда такой код оценивается.
Если мое понимание правильное, тогда, когда в JavaScript создается новая Лексическая среда, вводится новая область, поэтому переменные, объявленные внутри функции, не видны вне этой функции:
function example() {
var x = 10;
console.log(x); //10
}
console.log(x); //ReferenceError
Итак, в приведенном выше объявлении функции создается новая Лексическая среда, что означает, что x
недоступен в любых внешних Лексических средах, которые могут существовать.
Итак, часть цитаты выше о объявлениях функций, по-видимому, имеет смысл. Однако в нем также указано, что для предложения Catch в заявлении 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?
Итак, как работает область действия блока catch
? Есть ли у меня фундаментальное непонимание того, что такое Лексическая среда?