Зачем нам нужна VariableEnvironment для определения состояния контекста выполнения в Javascript? - PullRequest
1 голос
/ 08 мая 2020

В ECMAScript spe c указано, что:

LexicalEnvironment:

Идентифицирует лексическое окружение, используемое для разрешения ссылок на идентификаторы, сделанных кодом в этом контексте выполнения. .

Кроме того,

Компоненты LexicalEnvironment и VariableEnvironment в контексте выполнения всегда являются Lexical Environments. Когда создается контекст выполнения , его компоненты LexicalEnvironment и VariableEnvironment изначально имеют одинаковое значение.

И это:

Обычно лексическая среда связана с определенной структурой c syntacti c кода ECMAScript, такой как FunctionDeclaration, BlockStatement или предложение Catch в TryStatement, и каждый раз создается новая лексическая среда. такой код оценивается .

Вопрос в том, зачем нам в первую очередь нужна VariableEnvironment, если a LexicalEnvironment кажется достаточно для отслеживания привязок переменных и значений?

Теперь давайте посмотрим на этот пример кода в JavaScript [Вопросы в комментариях]:

var a = 1;
function x(b){
    var c = 2;
    // During the creation phase of the excution context of the function 
    // the ifStatement Block will it be skipped? 
    if(c >= 1){
        let d = 3;
        // Does e belongs to the Lexical Environment of the IfStatementBlock or to the FunctionDeclaration?
        var e = 4; 
        a = 5;
    }
}

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

VariableEnvironment используется для имен, которые ограничены всей функцией, а LexicalEnvironment используется для имен, которые ограничены ближайшим охватывающим блоком (EcmaScript 6 let и const).

В вашем примере c и e оба принадлежат VariableEnvironment функции. Объявления var поднимаются в верхнюю часть функции, но e не будет инициализирован, пока не будет введен блок if. Это эквивалентно:

var a = 1;

function x(b) {
  var c = 2;
  var e;
  if (c >= 1) {
    let d = 3;
    e = 4;
    a = 5;
  }
}
1 голос
/ 08 мая 2020

зачем нам в первую очередь нужна VariableEnvironment, если a LexcicalEnvironment кажется достаточно для отслеживания привязок переменных и значений?

Причина VariableEnviron mnet заключается в том, чтобы убедитесь, что существует локальная область действия, которую можно использовать, которая не мешает существующим областям. Без VariableEnvironment вообще не было бы области видимости, поскольку LexicalEnvironment постоянно изменялась бы при выполнении кода.

VariableEnvironment - определяет лексическое окружение, EnvironmentRecord которого содержит привязки, созданные с помощью VariableStatements в этом контексте выполнения.

Это определенно необходимо.

На этапе создания контекста выполнения функции оператор if Заблокировать будет ли оно пропущено?

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

Принадлежит ли e к лексической Окружение IfStatementBlock или FunctionDeclaration?

Поднимается переменная e, так как это var, и как таковая она является частью среды переменных для функции x. Значение d является частью внутренней LexicalEnvironment, созданной в результате объявления let внутри блока if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...