PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

В чем разница между окружением и контекстом?

Объекты и прототипы

Окружение (environment) и контекст (context) — связанные, но разные понятия: лексическое окружение хранит переменные области видимости, а контекст выполнения — более широкое понятие, включающее окружение, `this` и ссылку на внешнее окружение.

Лексическое окружение (Lexical Environment)

Структура, хранящая переменные и функции текущей области видимости плюс ссылку на внешнее окружение:

function outer() {
  let a = 1; // в лексическом окружении outer
  function inner() {
    let b = 2; // в лексическом окружении inner
    return a + b;
  }
}

Определяет доступность переменных (scope) и лежит в основе замыканий.

Контекст выполнения (Execution Context)

Более широкое понятие — среда исполнения кода, включающая:

  • Лексическое окружение (переменные).
  • Значение this.
  • Ссылку на внешнее окружение.

Создаётся при вызове функции, кладётся в call stack.

Соотношение

Контекст выполнения = Лексическое окружение (переменные) + this + внешняя ссылка

Окружение — часть контекста (отвечает за переменные). Контекст добавляет this и связь со стеком.

Разговорное употребление

Часто «контекст» в JS означают именно this, а «окружение» — переменные/scope. Формально контекст выполнения шире и включает окружение.

Коротко для собеседования

Лексическое окружение — структура с переменными области видимости и ссылкой на внешнее окружение (основа scope и замыканий). Контекст выполнения — шире: включает окружение, значение this и внешнюю ссылку; создаётся при вызове, кладётся в call stack. Окружение — часть контекста (переменные), контекст добавляет this.

Другие вопросы раздела