В чем разница между окружением и контекстом?
Объекты и прототипы
Окружение (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.