Чем отличаются типы функций и как это влияет на код?
Функции
Функции в JavaScript бывают разных типов — обычные, стрелочные, методы, конструкторы, генераторы, асинхронные — и различия влияют на `this`, hoisting и поведение вызова.
Типы функций
Обычные (Declaration/Expression)
Свой this (зависит от вызова), есть arguments, могут быть конструкторами.
Стрелочные
Нет своего this (лексический), нет arguments, не конструкторы. Для колбэков.
Методы объектов/классов
this = объект-владелец при вызове через точку.
Конструкторы (с new)
Создают объекты; this = новый экземпляр.
Генераторы (function*)
Возвращают итератор, приостанавливаются через yield.
function* gen() { yield 1; yield 2; }Асинхронные (async)
Всегда возвращают промис, разрешают await.
Как различия влияют на код
- this: обычные — динамический, стрелки — лексический. Ошибка выбора ломает контекст в колбэках.
- Hoisting: Declaration всплывает целиком, Expression/стрелка — нет.
- new: стрелки и async/генераторы нельзя вызвать как конструктор.
- arguments: только у обычных функций.
Коротко для собеседования
Типы функций: обычные (свой this, arguments, конструктор), стрелочные (лексический this, компактные), методы, конструкторы (new), генераторы (yield), async (промис + await). Различия в this, hoisting и new определяют, где какую применять.