В чем разница между функциями классическими и стрелочными?
Классы
Классические и стрелочные функции различаются прежде всего работой с `this`, а также наличием `arguments`, возможностью быть конструктором и синтаксисом.
Различия
- this — классическая получает
thisпри вызове (динамически); стрелка берёт лексически из окружения. - arguments — есть у классической; у стрелки нет (используют rest
...args). - new — классическую можно вызвать как конструктор; стрелку нельзя (нет
prototype). - hoisting — Function Declaration всплывает целиком; стрелка (как выражение) — нет.
const obj = {
name: 'Ann',
regular() { return this.name; }, // this = obj
arrow: () => this.name, // this из окружения (не obj)
};Где что применять
- Стрелки — колбэки, методы массива, обработчики внутри классов (сохранить внешний
this). - Классические — методы объектов (нужен свой
this), конструкторы, где нуженarguments.
class Timer {
s = 0;
start() { setInterval(() => this.s++, 1000); } // стрелка сохраняет this
}Коротко для собеседования
Классическая функция имеет свой this (по вызову), arguments, prototype и работает с new. Стрелка берёт this лексически, без arguments/prototype, не конструктор. Стрелки — для колбэков, классические — для методов объектов и конструкторов.