Я изучаю спецификацию ECMAScript, чтобы выяснить, каково ожидаемое поведение операторов vars
внутри блока в соответствии со спецификацией:
function test() {
console.info('before block', bar);
{
console.info('in block before declaration', bar);
var bar = 30;
console.info('in block after declaration', bar);
}
console.info('after block', bar);
}
test();
Я знаю, что var
не имеет блочной области видимости. Но мне интересно, как в спецификации используются конкретные определения шагов для достижения этой цели.
Я прочитал семантику DeclarationInstantiation
функции и глобального. Они используют статическую семантику VarDeclaredNames
и VarScopedDeclarations
тела функции или скрипта для создания привязок к записи среды. Но я не могу найти в этой статической семантике определения того, как обращаться с оператором блока с вложенным StatementList. Спецификация определяла производство только для пустого блока (без каких-либо операторов):
Или Block: { StatementList }
следует рассматривать непосредственно как StatementList
?
Но в 14.2 это определяется как один оператор?
Я обнаружил, что другая семантика включает инструкции по производству Block { statementList }
, поэтому я ожидаю увидеть что-то вроде:
Block: { StatementList }
1. Return VarDeclaredNames of StatementList.
Вот пример определенных производственных инструкций Block { statementList }
в операции оценки:
@Бармар Да, я согласен. Поэтому я ожидаю увидеть что-то вроде «VarDeclaredNames: Block { StatementList }
: 1. Вернуть VarDeclaredNames из StatementList». Но в спецификации я этого не нашел.
Это примечание вверху § 14.3.2. Оператор Variable: «Инструкция var
объявляет переменные, область действия которых ограничена VariableEnvironment текущего контекста выполнения. Переменные Var создаются, когда создается экземпляр содержащей их записи среды, и инициализируются как неопределенные при создании. [...]» Это то, чем вы являетесь? находясь в поиске?
Просто внимательно прочитайте вопрос. Я не собираюсь это повторять. Короче говоря, это вопрос о спецификации языка ECMA Script и, по-видимому, недостающей части в спецификации объявления переменных в контексте синтаксически ориентированного анализа. Речь, конечно, не идет о 7 задачах, которые на самом деле являются этапами процедуры в контексте семантики времени выполнения, о чем их вопрос не в этом, а дано для сравнения.
Пожалуйста, отредактируйте свой пост, чтобы заменить все изображения текста реальным текстом. Уценка прекрасно это поддерживает.
@wahwahwah Возможно, мой ответ поможет тебе понять, о чем был вопрос
Я ожидаю увидеть что-то вроде:
Block: { StatementList } 1. Return VarDeclaredNames of StatementList.
Ваше ожидание вполне обосновано, но было бы довольно скучно и сложно определять VarDeclaredNames
для каждого отдельного синтаксического элемента, не делая ничего, кроме рекурсии к его элементу-потомку.
Поэтому авторы спецификации решили дать только неявное определение этих Синтаксически-ориентированных операций:
Если явно не указано иное, вся цепочка постановки иметь неявное определение для каждой операции, которая может быть применена к левой части нетерминала этой продукции. Неявное определение просто повторно применяет ту же операцию с тем же параметры, если они есть, в цепочку производство единственная нетерминальная правая часть, а затем возвращает результат.
См. также пример, следующий за этим абзацем.
Спасибо! Это то, что я ищу. Определение «цепного производства» и неявное определение его семантического правила объясняют, как обращаться с производством Block: { StatementList }
.
Блоки AFAIK не влияют на объявления
var
. Они ограничены функциями, а не блоками, как объявленияlet
иconst
ES6.