Стрілкові функції проти звичайних
1. Синтаксис
Звичайна функція:
function sayHello(name) {
return `Hello, ${name}!`;
}Стрілкова функція:
const sayHello = (name) => `Hello, ${name}!`;Короткий синтаксис стрілок робить код коротшим і особливо зручний у колбеках (
map,filter,reduceтощо).
2. Основні відмінності
| Особливість | function | => (стрілкова функція) |
|---|---|---|
this | Має свій this (залежить від контексту виклику) | Не має власного this - бере this із зовнішнього контексту |
arguments | Є об'єкт arguments | Немає arguments |
new / конструктор | Можна використовувати з new | Не можна використовувати з new |
prototype | Має | Не має |
return | Потрібен явно (окрім короткого запису) | Можна писати без return, якщо однорядкова |
Підтримка super / this у класах | Працює як зазвичай | Захоплює this батька (зручно для обробників) |
Приклад 1. Різниця в this
Звичайна функція
const user = {
name: 'Tim',
sayHi: function() {
console.log(this.name);
}
};
user.sayHi(); // 'Tim'
thisвсередині звичайної функції посилається на об'єкт, з якого вона викликана.
Стрілкова функція
const user = {
name: 'Tim',
sayHi: () => {
console.log(this.name);
}
};
user.sayHi(); // undefined
thisу стрілкової функції не свій - вона береthisіз зовнішнього лексичного оточення, а в цьому випадку це глобальний контекст, деthis.nameне визначено.
Приклад 2. Використання this всередині методу з setTimeout
const user = {
name: 'Tim',
sayHi: function() {
setTimeout(function() {
console.log(this.name);
}, 1000);
}
};
user.sayHi(); // undefined (this вказує на window)Виправлено за допомогою стрілкової функції:
const user = {
name: 'Tim',
sayHi: function() {
setTimeout(() => {
console.log(this.name);
}, 1000);
}
};
user.sayHi(); // 'Tim'Тут стрілкова функція не створює власний
this, тому бере його зsayHi()- і це потрібний нам об'єктuser.
Приклад 3. Не можна використовувати new зі стрілкою
function User(name) {
this.name = name;
}
const u1 = new User('Tim'); // працює
const ArrowUser = (name) => {
this.name = name;
};
const u2 = new ArrowUser('Tim'); // TypeError: ArrowUser is not a constructorСтрілкові функції не мають прототипу і не можуть бути конструкторами.
Приклад 4. Немає arguments
function showArgs() {
console.log(arguments);
}
showArgs(1, 2, 3); // [1, 2, 3]const showArgsArrow = () => {
console.log(arguments);
};
showArgsArrow(1, 2, 3); // ReferenceError: arguments is not definedВикористовуй rest-параметри замість arguments:
const showArgsArrow = (...args) => console.log(args);
showArgsArrow(1, 2, 3); // [1, 2, 3]Приклад 5. Короткий запис без return і {}
const double = x => x * 2;
console.log(double(4)); // 8Якщо функція однорядкова, можна не писати
returnі фігурні дужки.
Коли використовувати
| Сценарій | Що обрати |
|---|---|
Методи об'єкта / класів (потрібен this) | function |
Колбеки (map, filter, reduce, forEach) | => |
Обробники подій у класах React (щоб не втратити this) | => |
| Конструктори, прототипи | function |
| Короткі утилітарні функції | => |
Коротко:
function- універсальний інструмент із власним контекстом, може бути конструктором.=>- компактна форма, безthis,argumentsіprototype, ідеальна для вкладених функцій і колбеків.
Швидкий підсумок у таблиці:
| Відмінність | function | => (стрілкова) |
|---|---|---|
Має свій this | Так | Ні |
Можна викликати з new | Так | Ні |
Має arguments | Так | Ні |
Має prototype | Так | Ні |
| Можна використати як метод | Так | Лише без this |
| Зручна в колбеках | Середньо | Дуже |
| Короткий синтаксис | Ні | Так |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.