Будет выведено «Пока, Вася». Локальная 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 изменила бы область видимости и поведение, а не просто стиль записи.