Классические функции (объявленные через ключевое слово
function
) и стрелочные функции (введённые в ES6 через =>
синтаксис) являются двумя способами объявления функций, но между ними есть несколько важных различий:function add(a, b) {
return a + b;
}
const add = (a, b) => a + b;
Предлагают более краткий синтаксис для написания функций, особенно если функция состоит из одного выражения.
В классических функциях контекст определяется тем, как функция была вызвана. В стрелочных функциях контекст наследуется из окружающего контекста (лексический контекст 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);
}
};
Классические функции могут использоваться с помощью ключевого слова
new
. Стрелочные функции не могут быть использованы как конструкторы, и попытка это сделать приведет к ошибке.function Person(name)
{
this.name = name;
}
const person = new Person("Alice");
const Person = (name) => {
this.name = name;
};
// const person = new Person("Alice"); // Ошибка: Person не является конструктором
В классических функциях можно использовать объект
arguments
, который содержит аргументы, переданные функции. В стрелочных функциях нет объекта arguments
, но можно использовать оператор расширения ...
для достижения аналогичного результата.Основные различия между классическими и стрелочными функциями заключаются в синтаксисе, поведении
this
, использовании в качестве конструктора и доступе к аргументам функции. Стрелочные функции предлагают более краткий синтаксис и удобны для написания коротких функций, а также при работе с контекстом this
в обратных вызовах и замыканиях. Однако для более сложных сценариев, требующих использования this
в различных контекстах или создания конструкторов, предпочтительнее использовать классические функции.