З чого складається контекст виконання?
Контекст виконання (Execution Context) у JavaScript складається з трьох основних компонентів - це внутрішні структури, які рушій створює для роботи твого коду.
Структура контексту виконання
Кожен контекст (глобальний або функції) включає:
- Variable Environment (VE)
- Lexical Environment (LE)
- This Binding (зв'язка this)
1. Variable Environment
Зберігає змінні та функції, оголошені за допомогою var, function (не let/const!).
- Визначається при створенні контексту.
- Використовується для ініціалізації змінних і функцій.
- Доступний лише всередині поточного контексту.
Приклад:
function test() {
var a = 10;
function inner() {}
}Тут a і inner - частина Variable Environment функції test.
2. Lexical Environment
Відповідає за пошук змінних і замикання. Зберігає:
- змінні, оголошені через
letіconst; - посилання на зовнішні оточення (outer lexical environment reference);
- функцію як "лексичне оточення".
Можна уявити як "ланцюжок областей видимості" (scope chain).
Приклад:
let x = 10;
function outer() {
let y = 20;
function inner() {
let z = 30;
console.log(x, y, z);
}
inner();
}
outer();Lexical Environment функції inner() містить:
- свою змінну
z - посилання на оточення
outer()(деy) - і посилання на глобальне оточення (де
x)
Саме Lexical Environment робить можливими замикання (closures).
3. This Binding
Визначає, на який об'єкт посилається this у цьому контексті.
Залежить від того, як викликана функція:
| Спосіб виклику | Значення this |
|---|---|
| Глобально (у браузері) | window |
| У функції (строгий режим) | undefined |
| У методі об'єкта | сам об'єкт |
Через call, apply, bind | значення, передане вручну |
| У стрілковій функції | береться із зовнішнього контексту |
Приклад:
const obj = {
name: "Tim",
show() {
console.log(this.name);
}
};
obj.show(); // this = obj -> "Tim"Зведена структура
Кожен контекст виконання виглядає приблизно так:
Execution Context {
LexicalEnvironment: {
EnvironmentRecord: { let, const },
OuterEnvironmentReference: <посилання на зовнішній LE>
},
VariableEnvironment: {
EnvironmentRecord: { var, function },
OuterEnvironmentReference: <посилання на зовнішній LE>
},
ThisBinding: <значення this>
}Приклад візуально
let a = 1;
function outer() {
var b = 2;
function inner() {
let c = 3;
console.log(a, b, c);
}
inner();
}
outer();Коли викликається inner():
- Створюється новий Execution Context, який містить:
- Variable Environment:
[] - Lexical Environment:
{ c: 3 } - This Binding:
undefined(строгий режим)
- Variable Environment:
- Має Outer Environment Reference -> outer -> global,
що дозволяє знаходити
bіa.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.