Стрелочные функции короче, но реальные различия заключаются в поведении привязки, а не только в синтаксисе.
const regular = function () {};
const arrow = () => {};
const short = x => x * 2; // implicit return for one expression
Стрелочные функции короче, но реальные различия заключаются в поведении привязки, а не только в синтаксисе.
const regular = function () {};
const arrow = () => {};
const short = x => x * 2; // implicit return for one expression
1. Нет собственного this — стрелочные функции наследуют this из окружающей области видимости. Это самое важное отличие и причина, почему они отлично подходят для callback-функций:
const timer = {
seconds: 0,
start() {
setInterval(() => this.seconds++, 1000); // ✅ `this` is timer
// a regular function here would have its own `this` (undefined) → bug
},
};
2. Нет объекта arguments — используйте rest-параметры вместо этого:
const sum = (...args) => args.reduce((a, b) => a + b, 0);
3. Не могут использоваться как конструкторы — new arrow() выбросит ошибку, и у них нет prototype.
const obj = {
name: "Ann",
greet: () => `Hi ${this.name}`, // ❌ `this` is NOT obj (it's outer scope)
greet2() { return `Hi ${this.name}`; }, // ✅ method needs dynamic `this`
};
Не используйте стрелочные функции для методов объектов (они не привяжутся к объекту) или когда вам нужен динамический this/arguments (обработчики событий, которые полагаются на то, что this будет элементом).
Используйте стрелочные функции для callback-функций и коротких функций, где наследование this — это то, что вам нужно; используйте обычные функции для методов, конструкторов и методов прототипа.