Page 72 - 6105
P. 72
Наприклад, для виклику функції pow (2, 3) з прикладу вище, буде створений
контекст виконання, який буде зберігати змінні x = 2, n = 3. Позначимо його
схематично так:
Контекст: {x: 2, n: 3, рядок 1}
Далі функція pow починає виконуватися. Обчислюється вираз n! = 1 - він
дорівнює true, адже в поточному контексті n = 3. Тому задіюється перша гілка if:
function pow (x, n) {
if (n! = 1) {// поки n! = 1 зводити обчислення pow
(x, n) до pow (x, n-1)
return x * pow (x, n - 1);
} Else {
return x;
}
}
Щоб обчислити вираз x * pow (x, n-1), потрібно провести запуск pow з
новими аргументами. При будь-якому вкладеному виклику JavaScript запам'ятовує
поточний контекст виконання в спеціальній внутрішній структурі даних – «стеку
контекстів». Потім інтерпретатор приступає до виконання вкладеного виклику. В
даному випадку викликається та ж pow, проте це абсолютно неважливо. Для будь-
яких функцій процес однаковий.
Для нового виклику створюється свій контекст виконання, і управління
переходить в нього, а коли він завершений – старий контекст дістається зі стека і
виконання зовнішньої функції поновлюється.
Розберемо, що відбувається з контекстами більш детально, починаючи з
виклику (*):
function pow (x, n) {
if (n! = 1) {// поки n! = 1 зводити обчислення pow
(.. n) до pow (.. n-1)
71