Стрілочна функція (arrow function) і звичайна функція (function declaration/expression) в JavaScript мають кілька відмінностей:

1. Синтаксис

2. this

3. Конструктор

Відсутність this призводить до ще одного обмеження: стрілкові функції не можуть бути використані як конструктори. Їх не можна викликати з new.

const Foo = () => {};
const foo = new Foo(); // Викличе помилку

4. arguments

Стрілочні функції не мають власного об'єкта arguments, тоді як звичайні функції мають.

const fn1 = () => {
    console.log(arguments); // Викличе помилку
};

function fn2() {
    console.log(arguments); // Доступ до всіх аргументів
}

5. super

Стрілкові функції не мають super. Якщо super доступний, то він береться із зовнішньої функції.

class Animal {
  speak() {
    console.log("The animal makes a sound");
  }
}

class Dog extends Animal {
  bark() {
    // Використання звичайної функції - `this` залежить від того, як викликається функція
    setTimeout(function() {
      console.log("Regular function:");
      super.speak(); // Це викличе помилку, оскільки `this` не визначено
    }, 1000);

    // Використання стрілочної функції - `this` лексично прив'язаний до екземпляра Dog
    setTimeout(() => {
      console.log("Arrow function:");
      super.speak(); // Це працює, оскільки `this` посилається на екземпляр класу Dog
    }, 2000);
  }
}

const dog = new Dog();
dog.bark();