Как выполняется функция с учетом хостинга в JavaScript
Что проверяют
Понимаете ли вы, как движок готовит функцию к выполнению, а не только помните, что «объявления поднимаются». В вопросе речь о hoisting, по-русски «поднятие». Следом почти всегда просят объяснить разницу между var, let и const и предсказать вывод небольшого фрагмента кода.
Как отвечать
Опишите вызов функции как два этапа. При вызове создаётся контекст выполнения и кладётся на стек вызовов. Сначала идёт фаза создания: движок заводит лексическое окружение, связывает параметры, this и arguments (у стрелочных функций своих this и arguments нет), регистрирует все объявления из тела. Потом код выполняется строка за строкой. Физически ничего никуда не переносится: «поднятие» это следствие того, что объявления известны до первой строки.
Как ведут себя разные объявления:
- function declaration: создаётся целиком, её можно вызвать выше по тексту;
var: переменная существует с начала функции со значениемundefined;let,const,class: тоже поднимаются, но до строки объявления находятся во временной мёртвой зоне (TDZ), обращение даётReferenceError;- function expression и стрелка: поднимается только переменная. С
varвызов до присваивания даётTypeError: ... is not a function, сconstужеReferenceError.
Добавьте две детали, которые отличают сильный ответ. Имя именованного функционального выражения видно только внутри него самого. Объявление функции внутри блока if в строгом режиме и в ES-модулях ограничено блоком, а в нестрогом режиме подчиняется унаследованным правилам и ведёт себя по-разному в разных ситуациях, поэтому так писать не стоит.
Где спотыкаются
Говорят, что let и const не поднимаются. Поднимаются, иначе не было бы TDZ: let x = 1; { console.log(x); let x = 2; } падает с ошибкой, а не печатает единицу.
Утверждают, что функциональное выражение «вообще не поднимается», и не могут объяснить, откуда тогда TypeError, а не ReferenceError.
Пересказывают поднятие как перенос кода наверх файла. Интервьюер тут же спросит про фазы создания и выполнения, и ответ рассыплется.