Исследование подъёма переменной в самовызывающейся функции

Будет выведено «Пока, Вася». Локальная var name поднята в область всей IIFE и затеняет внешнюю name ещё до выполнения if.

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

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

Будет выведено «Пока, Вася». Локальная var name поднята в область всей IIFE и затеняет внешнюю name ещё до выполнения if.

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

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

Условие

Разберите, каким образом происходит hoisting переменной name внутри IIFE, и предскажите, какой текст появится в консоли.

var name = 'Коля!';

(function () {
    if (typeof name === 'undefined') {
        var name = 'Вася';
        console.log('Пока, ' + name);
    } else {
        console.log('Привет, ' + name);
    }
})();

Ответ

Будет выведено «Пока, Вася». Локальная var name поднята в область всей IIFE и затеняет внешнюю name ещё до выполнения if.

В начале вызова локальная name имеет значение undefined. Поэтому typeof name === 'undefined' истинно; затем ей присваивается 'Вася' и исполняется первая ветка.

Поднимается объявление, не присваивание. У var нет блочной области if, поэтому внешнее 'Коля!' не используется ни в одной ветке этой функции. После завершения IIFE внешняя переменная остаётся неизменной. Замена var на let внутри if изменила бы область видимости и поведение, а не просто стиль записи.

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

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

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

Подробнее