← Назад к вопросам

Какие знаешь особенности стрелочной функции?

1.8 Middle🔥 281 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Особенности стрелочных функций в JavaScript

Стрелочные функции, появившиеся в ES6 (ES2015), — это компактная альтернатива традиционным функциональным выражениям, но с несколькими ключевыми семантическими отличиями. Они не просто «синтаксический сахар», а функции с уникальным поведением.

1. Синтаксис и компактность

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

// Традиционная функция
const sumTraditional = function(a, b) {
    return a + b;
};

// Стрелочная функция (полная форма)
const sumArrow = (a, b) => {
    return a + b;
};

// Компактная форма с неявным возвратом (implicit return)
const sumCompact = (a, b) => a + b;

// Для одного параметра скобки можно опустить
const square = x => x * x;

// Для функции без параметров — обязательны пустые скобки
const greet = () => 'Hello!';

2. Отсутствие собственного this

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

function TraditionalClass() {
    this.value = 42;

    // Традиционная функция создаёт свой собственный `this`
    setTimeout(function() {
        console.log(this.value); // undefined! `this` ссылается на объект window/global или undefined в strict mode
    }, 100);

    // Стрелочная функция использует `this` из лексической области — из функции TraditionalClass
    setTimeout(() => {
        console.log(this.value); // 42! `this` корректно ссылается на экземпляр TraditionalClass
    }, 100);
}

Это поведение делает стрелочные функции идеальными для использования в методах, где требуется доступ к контексту родительского объекта (например, в обработчиках событий, промисах, колбэках setTimeout внутри классов).

3. Отсутствие собственного объекта arguments

Стрелочные функции не имеют своего локального псевдомассива arguments. Они используют arguments из внешней (лексической) области.

function outerFunction(a, b) {
    const innerArrow = () => {
        console.log(arguments); // Выведет аргументы outerFunction: { 0: 1, 1: 2 }
    };
    innerArrow();
}
outerFunction(1, 2);

// Для получения всех параметров в стрелочной функции используйте rest-оператор
const showArgs = (...args) => console.log(args);

4. Не могут быть использованы как конструктор

Стрелочные функции не имеют внутреннего метода [[Construct]] и прототипа prototype. Попытка вызвать их с оператором new приведёт к ошибке.

const ArrowFunc = () => {};
// new ArrowFunc(); // TypeError: ArrowFunc is not a constructor
console.log(ArrowFunc.prototype); // undefined

5. Не могут быть использованы как методы-генераторы

Синтаксис function* для создания генераторов неприменим к стрелочным функциям. Для генераторов нужно использовать традиционное объявление.

6. Особенности с call, apply, bind

Поскольку контекст this стрелочной функции жёстко привязан к лексическому окружению, методы call(), apply() и bind() не могут изменить его. Они всё ещё могут использоваться для передачи аргументов, но this будет проигнорирован.

const obj = { value: 100 };
const getValue = () => this.value;

console.log(getValue.call(obj)); // Не 100, а undefined (или значение из внешнего контекста)

7. Отсутствие свойства super и new.target

Внутри стрелочных функций не определены super (для наследования классов) и new.target. Если они нужны, следует использовать традиционные функции.

Практические рекомендации и выводы

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

  • Колбэки и анонимные функцииmap, filter, then промисов, setTimeout).
  • Методы, где нужно сохранить лексический this (например, внутри классов React до появления полей класса).
  • Короткие однострочные операции для улучшения читаемости.

Когда НЕ использовать стрелочные функции:

  • В методах объектов, если нужен доступ к this самого объекта (лучше использовать обычные функции или сокращённый синтаксис методов ES6).
  • В конструкторах (невозможно).
  • В функциях-генераторах.
  • В функциях, где нужен динамический this (например, в обработчиках событий DOM, если this должен указывать на элемент, к которому привязан обработчик — здесь чаще подходит обычная функция).
  • При использовании arguments (лучше использовать rest-оператор ...).

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

Какие знаешь особенности стрелочной функции? | PrepBro