Что покажет консоль после вызова вложенных функций

Консоль последовательно выведет 2, 3, 4, 2. fun1 хранит состояние первого вызова outer, а fun2 получает независимую переменную a со стартовым значением 1.

Короткий ответ

Что ответить на собеседовании

Консоль последовательно выведет 2, 3, 4, 2. fun1 хранит состояние первого вызова outer, а fun2 получает независимую переменную a со стартовым значением 1.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой результат будет напечатан в консоль при последовательных вызовах функций.

function outer() {
    let a = 1;
    return function inner() {
        a++;
        console.log(a);
    };
}

let fun1 = outer();
fun1();
fun1();
fun1();
let fun2 = outer();
fun2();

Ответ

Консоль последовательно выведет 2, 3, 4, 2. fun1 хранит состояние первого вызова outer, а fun2 получает независимую переменную a со стартовым значением 1.

В каждом outer создаётся новое лексическое окружение. inner замыкает именно его a и сначала увеличивает значение, затем печатает. Возврат из outer не уничтожает a, пока на неё ссылается доступная функция.

Три вызова fun1 используют одно окружение; вызов outer для fun2 создаёт другое. Если бы a была объявлена вне outer, оба счётчика могли бы разделять одну переменную, но в данном коде этого нет.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее