Печать переменной c с учётом всплытия и тайм‑аута

Порядок вывода: undefined, 5, undefined, 10. У внешней функции и callback таймера разные локальные var c, каждая из которых до присваивания равна undefined.

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

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

Порядок вывода: undefined, 5, undefined, 10. У внешней функции и callback таймера разные локальные var c, каждая из которых до присваивания равна undefined.

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

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

Условие

В функции выводятся значения переменной c в разных точках выполнения, демонстрируя поведение всплытия (hoisting) и работу асинхронного setTimeout.

function l() {
    console.log(c);
    var c = 5;
    setTimeout(function() {
        console.log(c);
        var c = 10;
        console.log(c);
    }, 100);
    console.log(c);
};

l()

Ответ

Порядок вывода: undefined, 5, undefined, 10. У внешней функции и callback таймера разные локальные var c, каждая из которых до присваивания равна undefined.

Первый console.log в l читает её поднятую локальную c до присваивания 5. Затем регистрируется таймер и синхронно печатается 5. В callback собственное var c затеняет внешнюю переменную на всём протяжении функции, поэтому первое чтение там даёт undefined, а не 5. После присваивания 10 второй callback-log выводит 10.

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

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

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

Подробнее