В чём разница между классической функцией и стрелочной

Классические функции (объявленные через ключевое слово `function`) и стрелочные функции (введённые в ES6 через `=>` синтаксис) являются двумя способами объявления функций, но между ними есть несколько важных различий:

1. Синтаксис
Классическая функция:

function add(a, b) {
  return a + b;
}

Стрелочная функция:

const add = (a, b) => a + b;

Предлагают более краткий синтаксис для написания функций, особенно если функция состоит из одного выражения.

2. Контекст `this`
В классических функциях контекст определяется тем, как функция была вызвана. В стрелочных функциях контекст наследуется из окружающего контекста (лексический контекст `this`), где функция была объявлена.

Пример с классической функцией:

const obj = {
  id: 42,
  counter: function() {
    setTimeout(function() {
      console.log(this.id); // `this` ссылается на глобальный объект или undefined в строгом режиме, а не на obj
    }, 1000);
  }
};

Пример со стрелочной функцией:

const obj = {
  id: 42,
  counter: function() {
    setTimeout(() => {
      console.log(this.id); // `this` корректно ссылается на obj, так как стрелочная функция наследует `this` из окружения
    }, 1000);
  }
};

3. Конструктор
Классические функции могут использоваться с помощью ключевого слова `new`. Стрелочные функции не могут быть использованы как конструкторы, и попытка это сделать приведет к ошибке.

Пример с классической функцией:

function Person(name) {
  this.name = name;
}
const person = new Person("Alice");

Попытка использовать стрелочную функцию как конструктор:

const Person = (name) => {
  this.name = name;
};
// const person = new Person("Alice"); // Ошибка: Person не является конструктором

4. Аргументы
В классических функциях можно использовать объект `arguments`, который содержит аргументы, переданные функции. В стрелочных функциях нет объекта `arguments`, но можно использовать оператор расширения `...` для достижения аналогичного результата.

Основные различия между классическими и стрелочными функциями заключаются в синтаксисе, поведении `this`, использовании в качестве конструктора и доступе к аргументам функции. Стрелочные функции предлагают более краткий синтаксис и удобны для написания коротких функций, а также при работе с контекстом `this` в обратных вызовах и замыканиях. Однако для более сложных сценариев, требующих использования `this` в различных контекстах или создания конструкторов, предпочтительнее использовать классические функции.

Feb. 22, 2024, easyoffer