Этот вопрос проверяет знание различий в hoisting между разными способами объявления функций.
Полностью всплывают только Function Declarations (объявления функций). Function Expressions (функциональные выражения), включая стрелочные функции, не всплывают - всплывает только объявление переменной, но не присваивание функции. Объявления классов также не всплывают.
Поведение hoisting значительно различается в зависимости от способа объявления функции.
Function Declaration (полное всплытие):
// Работает - функция полностью доступна
sayHello(); // "Hello"
function sayHello() {
return "Hello";
}Function Expression (частичное всплытие):
// Не работает - переменная всплыла, но равна undefined
sayHello(); // TypeError: sayHello is not a function
var sayHello = function() {
return "Hello";
};Стрелочные функции:
// Не работает - аналогично Function Expression
sayHello(); // ReferenceError (let/const) или TypeError (var)
const sayHello = () => {
return "Hello";
};Классы:
// Не работает - классы не всплывают
const obj = new MyClass(); // ReferenceError
class MyClass {
constructor() {}
}Практический пример:
// Function Declaration - работает
console.log(add(2, 3)); // 5
function add(a, b) { return a + b; }
// Function Expression - не работает
console.log(multiply(2, 3)); // TypeError
var multiply = function(a, b) { return a * b; };
// Стрелочная функция - не работает
console.log(divide(6, 2)); // ReferenceError
const divide = (a, b) => a / b;Рекомендации:
Используйте Function Declarations для утилитных функций
Для callbacks и методов используйте Function Expressions
Всегда объявляйте функции до их использования