Какие есть способы объявления функций в JavaScript и их особенности
Что проверяют
Знаете ли вы, чем объявление отличается от выражения, и понимаете ли особенности стрелочной функции.
Как отвечать
Объявление функции. Поднимается целиком: вызвать можно до строки объявления.
sum(1, 2); // работает
function sum(a, b) { return a + b; }Функциональное выражение. Функция как значение. Поднимается только имя переменной, вызов до присваивания даст ошибку.
const sum = function (a, b) { return a + b; };Стрелочная функция. Короткая запись, но отличается по сути: у неё нет своего this (берётся из места объявления), нет arguments, её нельзя вызвать через new и у неё нет prototype. Поэтому она удобна для колбэков и опасна как метод объекта.
Метод объекта и класса. Сокращённая запись obj = { hello() {} }, this определяется вызовом.
Конструктор Function. Создаёт функцию из строки, не видит внешнюю область видимости и по сути тот же eval. В обычном коде не используется.
Отдельно: у функции есть name и length (число объявленных параметров), а параметры по умолчанию и остаточный параметр в length не считаются.
Где спотыкаются
Не могут объяснить, почему объявление вызывается до строки, а выражение нет.
Пишут метод объекта стрелкой и теряют this.
Считают, что стрелка это просто короткий синтаксис.
Не знают, что именованное функциональное выражение видит своё имя внутри себя, а снаружи нет.