Проверяет понимание hoisting и различий между function declaration и function expression, что важно для предсказуемости кода на JavaScript.
В JavaScript существует механизм hoisting (поднятие), который перемещает объявления переменных и функций в начало их области видимости на этапе компиляции. Однако важно различать, что именно поднимается: объявление или инициализация.
Если функция объявлена как function foo() {}, то поднимается и имя, и тело функции. Такую функцию можно вызвать до её текстового объявления. Если же функция присвоена переменной через var foo = function() {}, то поднимается только объявление переменной var foo, а присваивание значения происходит в момент выполнения строки. До этой строки foo равно undefined.
// Пример 1: function declaration
console.log(decl()); // работает, выведет "ok"
function decl() { return "ok"; }
// Пример 2: function expression с var
console.log(expr()); // TypeError: expr is not a function
var expr = function() { return "ok"; };
// Пример 3: что видит движок после hoisting
// var expr; // поднято
// console.log(expr()); // expr === undefined
// expr = function() { return "ok"; };Hoisting для var создаёт переменную в начале функции или глобальной области и инициализирует её значением undefined. Присваивание функции происходит позже, в порядке выполнения кода. Поэтому вызов до присваивания — это вызов undefined, что приводит к ошибке.
Для let и const ситуация ещё строже: они тоже поднимаются, но находятся в temporal dead zone (временной мёртвой зоне) до момента объявления. Обращение к ним до объявления вызывает ReferenceError, а не TypeError.
// let/const: ReferenceError
console.log(fnLet()); // ReferenceError: Cannot access 'fnLet' before initialization
let fnLet = function() { return "ok"; };Итог: если нужна возможность вызова до объявления, используйте function declaration. Если функция присвоена через var, вызов до присваивания невозможен — будет ошибка. Понимание этого различия помогает избегать неочевидных багов и правильно структурировать код.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию