Коротка відповідь
middleFunction — це декларація з ключовим словом `function`, має власний `this` і може бути hoisted. Arrow function — це лямбда-вираз, не має own `this`, не hoisted, синтаксис коротший. Приклад: `function add(a,b){return a+b}` vs `const add = (a,b)=>a+b`
Повне пояснення
Що це і навіщо
function– традиційний спосіб оголошення функції, підтримує hoisting і власнеthis.- Arrow function – компактний синтаксис, захоплює зовнішнє
this, не створює власного контексту, підходить для колбеків і лямбда-операцій.
Ключові принципи/терміни
thisbinding: у функції – динамічний, у arrow – лексичний.- Hoisting:
functionhoisted; arrow не hoisted, треба оголосити перед використанням. - Параметри: arrow може опускати круглі дужки при одному параметрі.
Як це працює
- При виклику
functionстворюється новий контекст виконання, що включає власнеthis. - Arrow function просто копіює значення
thisз оточуючого блоку, тому не створює новий контекст.
Практика і реалізація
- У React‑компонентах класові методи часто переписують на arrow, щоб уникнути
bind(this). - У Redux‑middleware або async/await колбеках arrow забезпечує чистий синтаксис.
Тестування
- При Jest можна перевірити поведінку
this:
test('function this', () => {
function f(){ return this.x; }
const obj = {x:1, f};
expect(obj.f()).toBe(1);
});
test('arrow this', () => {
const f = () => this.x;
const obj = {x:1, f};
expect(obj.f()).toBeUndefined(); // arrow не береться
});
Оптимізація, типові помилки та edge cases
- Не використовувати arrow для конструктора (
new), боthisне буде прив’язаний. - У випадку колбеків, що потребують
this, залишайте звичайну функцію. - Перевіряйте hoisting: оголошення arrow після виклику призведе до ReferenceError.
Часті помилки
- Виклик arrow як конструктора → TypeError.
- Очікування hoisting для arrow → ReferenceError.
- Неправильне використання
thisу колбеку → undefined. - Забудьте про круглі дужки при одному параметрі, що може спричинити синтаксичну помилку.
Cheatsheet
function foo(){}– hoisted, own this.const foo = () => {}– не hoisted, лексичний this.const foo = (a,b)=>a+b– короткий синтаксис.
Follow‑up питання
- Як arrow function працює з
arguments? - Чому arrow не можна використовувати як метод у класі, якщо потрібен
this?