Какие способы создания функций есть в JavaScript и чем они отличаются?
Функции
В JavaScript функцию можно создать декларацией, выражением, стрелочной записью, как метод объекта или класса и, редко, через конструктор Function. Способы различаются подъёмом, this и возможностью вызова через new.
Function Declaration
function sum(a, b) { return a + b; }Поднимается целиком: вызвать можно до объявления.
Function Expression
const sum = function (a, b) { return a + b; };Создаётся при выполнении строки; до неё переменная недоступна (или undefined у var). Имя можно задать самой функции: const f = function inner() {} — оно видно только внутри.
Стрелочная функция
const sum = (a, b) => a + b;Нет своего this и arguments, нельзя вызвать через new, нет прототипа. Подходит для колбэков.
Метод
const obj = { greet() { return 'hi'; } };Короткая запись метода; this определяется объектом, у которого вызвана функция.
Генераторы и async
function* создаёт генератор, async function — функцию, возвращающую промис.
Конструктор Function
const sum = new Function('a', 'b', 'return a + b');Выполняется в глобальной области, не замыкает локальные переменные и не рекомендуется.
Сравнение
- Подъём: только у Declaration.
- `this`: у стрелочной берётся из внешней области, у остальных зависит от вызова.
- `new`: стрелочные функции и методы использовать как конструктор нельзя.
Коротко для собеседования
Declaration поднимается, Expression создаётся на месте выполнения, стрелочная функция не имеет своего this, arguments и не вызывается через new. Выбирают по необходимости контекста и читаемости.