Тема, шрифт, мова та інші налаштування інтерфейсу.
Статистика використання. Вимкнена, доки ви її не дозволите.
Реклама та вимірювання реклами. Вимкнені, доки ви їх не дозволите.
ПРО САЙТ
Усі відкриті вкладки сайту
JavaScript · Синтаксис · Проміжний
Стрілочні функції та this
10 завдань
Опануй синтаксис стрілочних функцій та зрозумій як `this` поводиться по-різному у стрілочних і звичайних функціях — ключова відмінність для класів, зворотних викликів та обробників подій.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Стрілочні функції — це компактна альтернатива звичайним виразам функцій. Різниця в синтаксисі проста; різниця в поведінці `this` — фундаментальна.
**Синтаксис**
```javascript
// Звичайний вираз функції
const double = function(x) { return x * 2; };
// Стрілочна функція — те саме
const double = (x) => { return x * 2; };
// Один параметр — дужки необов'язкові
const double = x => { return x * 2; };
// Один вираз — фігурні дужки та return необов'язкові (неявне повернення)
const double = x => x * 2;
// Без параметрів — дужки обов'язкові
const greet = () => "Hello!";
// Повернення літерала об'єкта — обгорни в дужки щоб уникнути неоднозначності з блоком
const makeUser = name => ({ name: name, active: true });
```
**Як `this` працює у стрілочних функціях**
Звичайна функція отримує власний `this` — визначається тим як вона викликається. Стрілочна функція не має власного `this`. Вона захоплює `this` з навколишнього лексичного середовища в момент визначення стрілочної функції, і він ніколи не змінюється.
```javascript
class Timer {
constructor() {
this.seconds = 0;
}
start() {
// Стрілочна функція: this === екземпляр Timer (лексичний this)
setInterval(() => {
this.seconds++;
console.log(this.seconds);
}, 1000);
}
startBroken() {
// Звичайна функція: this === undefined (strict) або глобальний об'єкт
setInterval(function() {
this.seconds++; // TypeError або NaN — неправильний this
}, 1000);
}
}
```
**Коли НЕ використовувати стрілочні функції**
Стрілочні функції підходять не завжди:
- Методи об'єкта: `this` у стрілочному методі посилається на зовнішню область, не на об'єкт.
- Конструктори: стрілочні функції не можна викликати через `new` — вони кидають TypeError.
- Об'єкт `arguments`: у стрілочних функцій немає власного `arguments`.
- Динамічний `this` (обробники подій де `this` має бути елементом): використовуй звичайні функції.
```javascript
const obj = {
value: 42,
getValue: () => this.value, // неправильно — this не є obj
getValueOk() { return this.value; }, // правильно
};
```
Стрілочні функції у методах масиву, класах та промісах
Стрілочні функції особливо зручні в трьох контекстах: методи масивів, методи класів з асинхронними колбеками та ланцюжки промісів. Кожен випадок використовує лексичний `this` або лаконічний синтаксис.
**Методи масивів — найпоширеніше використання**
```javascript
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2); // [2, 4, 6, 8, 10]
const evens = numbers.filter(n => n % 2 === 0); // [2, 4]
const total = numbers.reduce((sum, n) => sum + n, 0); // 15
// Ланцюжок
const result = numbers
.filter(n => n > 2)
.map(n => n * 10);
// [30, 40, 50]
```
Неявне повернення робить колбеки з одним виразом лаконічними без втрати ясності.
**Методи класів з setTimeout / setInterval**
```javascript
class Counter {
constructor() {
this.count = 0;
}
startCounting() {
setInterval(() => {
this.count++;
console.log(this.count);
}, 1000);
}
}
```
Стрілочна функція всередині `setInterval` захоплює `this` з області `startCounting` — тобто з екземпляра класу. Звичайна функція втратила б `this` при виклику таймером.
**Ланцюжки промісів**
```javascript
fetch("/api/user")
.then(res => res.json())
.then(data => {
console.log(data.name);
return data;
})
.catch(err => console.error(err));
```
Стрілочні функції роблять ланцюжок читабельним. Кожен колбек `.then` — однорядковий або короткий блок без зайвого ключового слова `function`.
**Повернення об'єкта з неявним return**
```javascript
const makePoint = (x, y) => ({ x, y });
makePoint(3, 5); // { x: 3, y: 5 }
```
Обгортай об'єкт у дужки — інакше `{` сприймається як початок блоку, не об'єктний літерал, і функція повертає `undefined`.
Порівняння пліч-о-пліч та швидкий довідник синтаксису.
**Варіанти синтаксису**
```javascript
// Кілька параметрів, блок тіло, явне повернення
const add = (a, b) => { return a + b; };
// Кілька параметрів, неявне повернення
const add = (a, b) => a + b;
// Один параметр, неявне повернення
const double = x => x * 2;
// Без параметрів
const rand = () => Math.random();
// Повернення об'єктного літерала (обгорнути в дужки)
const point = (x, y) => ({ x, y });
```
**Стрілочна vs звичайна функція — ключові відмінності**
`this`: Стрілочна — лексичний (успадковує з навколишньої області). Звичайна — динамічний (визначається місцем виклику).
`new`: Стрілочна — заборонено (кидає TypeError). Звичайна — дозволено (створює екземпляр).
`arguments`: Стрілочна — немає власного `arguments` (успадковує з функції що охоплює). Звичайна — має власний об'єкт `arguments`.
`prototype`: Стрілочна — немає властивості `prototype`. Звичайна — є `prototype`.
`super`: Стрілочна — успадковує від охоплюючого методу. Звичайна — кожен метод має власний `super`.
**Коли використовувати кожну**
Обирай стрілочну коли:
- Колбеки для методів масиву (map, filter, reduce)
- Колбеки де потрібно зберегти `this` з зовнішньої області (setTimeout, setInterval, проміси)
- Короткі вбудовані вирази де `function` додає шум
Обирай звичайну функцію коли:
- Методи об'єкта (потрібен `this` як об'єкт)
- Конструктори (виклик через `new`)
- Функції що використовують `arguments`
- Обробники подій де `this` має бути цільовим елементом
З масиву `products` відфільтруй лише товари з `price > 100` і перетвори кожен лише на `name`. Використовуй стрілочні функції для обох операцій. Виведи результат.
Напиши стрілочну функцію `makeProduct`, яка приймає `name` і `price` та повертає об'єкт `{ name, price }` з неявним поверненням.
Перевір з `"Laptop"` і `999`.
// твій код тут
console.log(makeProduct("Laptop", 999));
Клас `Counter` має `increment` як звичайний метод і `decrement` як стрілочну функцію-властивість. Виклич обидва на екземплярі та виведи `count` після кожного.
Спостерігай яка форма коректно працює після деструктуризації.
class Counter {
count = 0;
increment() {
this.count++;
}
decrement = () => {
this.count--;
};
}
const c = new Counter();
c.increment();
console.log(c.count);
c.decrement();
console.log(c.count);
// Деструктуруй і виклич — яка ламається?
const { increment, decrement } = c;
increment();
console.log(c.count);
decrement();
console.log(c.count);
Завершити ланцюжок промісів: resolve з значенням `42`, потім подвоїти у `.then`, потім вивести результат у наступному `.then`. Використовуй стрілочні функції для обох колбеків.
const p = new Promise(resolve => {
resolve(42);
});
p
.then(/* подвоїти значення */)
.then(/* вивести результат */);
Рішення
const p = new Promise(resolve => {
resolve(42);
});
p
.then(val => val * 2)
.then(val => console.log(val));
Ми використовуємо необхідні cookies для роботи сайту. З вашого дозволу ми також можемо зберігати налаштування сайту та використовувати аналітичні й рекламні cookies, щоб розуміти використання сайту й підтримувати розвиток проєкту.
* Ви завжди можете змінити свій вибір у налаштуваннях сайту.
Оберіть категорії cookies
Налаштування аналітики
Можна вимкнути аналітику використання платформи. Також можна надіслати в Google Analytics запит на видалення даних про використання цього сайту, пов'язаних із цим браузером.
Навчальний workspace
Навчайтеся, читаючи, запускаючи код і розв'язуючи задачі.
Практикуйте програмування з поясненнями тем, вправами, інструментами browser IDE, перевіркою regex і тренуванням друку коду в одному workspace.
Відкривайте інструменти у вкладках.Вправи, IDE-інструменти й тренажери залишаються доступними як вкладки сайту.
Перемикайтеся без втрати контексту.Переходьте між поясненнями, кодом та утилітами, зберігаючи своє місце.
Використовуйте sidebar як карту.Ліві панелі містять навігацію, налаштування, файли, libraries та керування інструментами.
PythonJavaScriptSQLite
Одна IDE, три практичні режими
Python у браузері.Запускайте невеликі скрипти, пробуйте бібліотеки й тренуйте API-запити без встановлення.
JavaScript для швидких експериментів.Перевіряйте код для браузера й порівнюйте ідеї поруч із навчальними матеріалами.
SQLite для практики з даними.Відкривайте оглядач бази даних, переглядайте таблиці, пишіть запити й вивчайте SQL локально.
ТемаIDE
Працюйте поруч у split tabs
Тримайте інструкції перед очима.Відкрийте вправу або довідкову сторінку поруч з IDE, замість постійних перемикань.
Порівнюйте інструменти під час навчання.Розміщуйте перевірки regex, пояснення та експерименти з кодом поруч, коли це потрібно для задачі.
Закрийте split, коли завершите.Workspace повернеться до однієї сфокусованої вкладки, а відкриті вкладки сайту залишаться доступними.
Тренажер друку коду
Або звичайного тексту
Тренажер розрахований на фізичну клавіатуру.Відкрийте цей розділ на ноутбуці або комп'ютері з широким екраном. На телефоні тренування друку не працюватиме коректно.
Швидкість: 0 зн/хв
0 слів/хв
Найкраща швидкість (60с): 0 зн/хв
0 слів/хв
Помилки: 0
Загальний час: 0.0 с
Щоб тренувати сліпий друк, не підглядайте на фізичну клавіатуру.