Каковы семантические правила VarScopedDeclarations и VarDeclaredNames в спецификации ECMAScript для непустого оператора блока?

Я изучаю спецификацию 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 } в операции оценки:

Блоки AFAIK не влияют на объявления var. Они ограничены функциями, а не блоками, как объявления let и const ES6.

Barmar 03.08.2024 19:41

@Бармар Да, я согласен. Поэтому я ожидаю увидеть что-то вроде «VarDeclaredNames: Block { StatementList }: 1. Вернуть VarDeclaredNames из StatementList». Но в спецификации я этого не нашел.

yucj 03.08.2024 19:48

Это примечание вверху § 14.3.2. Оператор Variable: «Инструкция var объявляет переменные, область действия которых ограничена VariableEnvironment текущего контекста выполнения. Переменные Var создаются, когда создается экземпляр содержащей их записи среды, и инициализируются как неопределенные при создании. [...]» Это то, чем вы являетесь? находясь в поиске?

InSync 03.08.2024 19:54

Просто внимательно прочитайте вопрос. Я не собираюсь это повторять. Короче говоря, это вопрос о спецификации языка ECMA Script и, по-видимому, недостающей части в спецификации объявления переменных в контексте синтаксически ориентированного анализа. Речь, конечно, не идет о 7 задачах, которые на самом деле являются этапами процедуры в контексте семантики времени выполнения, о чем их вопрос не в этом, а дано для сравнения.

trincot 03.08.2024 22:47

Пожалуйста, отредактируйте свой пост, чтобы заменить все изображения текста реальным текстом. Уценка прекрасно это поддерживает.

Mike 'Pomax' Kamermans 03.08.2024 23:14

@wahwahwah Возможно, мой ответ поможет тебе понять, о чем был вопрос

Bergi 04.08.2024 00:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я ожидаю увидеть что-то вроде:

Block: { StatementList }
  1. Return VarDeclaredNames of StatementList.

Ваше ожидание вполне обосновано, но было бы довольно скучно и сложно определять VarDeclaredNames для каждого отдельного синтаксического элемента, не делая ничего, кроме рекурсии к его элементу-потомку.

Поэтому авторы спецификации решили дать только неявное определение этих Синтаксически-ориентированных операций:

Если явно не указано иное, вся цепочка постановки иметь неявное определение для каждой операции, которая может быть применена к левой части нетерминала этой продукции. Неявное определение просто повторно применяет ту же операцию с тем же параметры, если они есть, в цепочку производство единственная нетерминальная правая часть, а затем возвращает результат.

См. также пример, следующий за этим абзацем.

Спасибо! Это то, что я ищу. Определение «цепного производства» и неявное определение его семантического правила объясняют, как обращаться с производством Block: { StatementList }.

yucj 04.08.2024 12:13

Другие вопросы по теме