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

В чем особенность взаимодействия this и стрелочной функции?

1.7 Middle🔥 291 комментариев
#JavaScript Core

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

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

Основное отличие

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

Как работает this в обычных функциях

В обычных функциях значение this определяется способом вызова функции:

const obj = {
  name: "Объект",
  greet: function() {
    console.log(this.name);
  }
};

obj.greet(); // "Объект" — this это obj

const func = obj.greet;
func(); // undefined (в strict mode) или window — this это контекст вызова

Как работает this в стрелочных функциях

В стрелочных функциях this определяется один раз при создании и берется из окружающего кода:

const obj = {
  name: "Объект",
  greet: () => {
    console.log(this.name); // undefined
  }
};

obj.greet(); // undefined — this это window (или global в Node.js)
// Стрелочная функция не может быть методом объекта!

Практические различия

Проблема в обычных функциях

function Counter() {
  this.count = 0;
  
  // Обычная функция теряет this при передаче колбэка
  setTimeout(function() {
    this.count++; // this это window, ошибка!
  }, 1000);
}

const counter = new Counter();

Решение со стрелочной функцией

function Counter() {
  this.count = 0;
  
  // Стрелочная функция сохраняет this из Counter
  setTimeout(() => {
    this.count++; // this это объект Counter!
  }, 1000);
}

const counter = new Counter();

В классах React

Это особенно важно в React для методов обработки событий:

class Button extends React.Component {
  constructor(props) {
    super(props);
    this.state = { clicked: false };
  }
  
  // Обычная функция — потеряет this
  handleClick() {
    this.setState({ clicked: true }); // ошибка: this undefined
  }
  
  // Стрелочная функция — сохранит this
  handleChange = () => {
    this.setState({ clicked: false }); // работает
  }
  
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>Обычная</button>
        <button onClick={this.handleChange}>Стрелочная</button>
      </div>
    );
  }
}

Невозможно переопределить this в стрелочной функции

Средства вроде call(), apply(), bind() не работают для стрелочных функций:

const arrow = () => {
  console.log(this);
};

const obj = { name: "объект" };

arrow.call(obj); // this все равно из лексического окружения
arrow.apply(obj); // не работает
arrow.bind(obj); // не работает

Для обычных функций это работает:

function regular() {
  console.log(this.name);
}

const obj = { name: "объект" };

regular.call(obj); // "объект" — this переопределен
regular.apply(obj); // "объект"
regular.bind(obj)(); // "объект"

Когда использовать каждый тип

Используй обычные функции для:

  • Методов объектов (нужен контекст объекта)
  • Конструкторов
  • Когда нужна гибкость переопределения this

Используй стрелочные функции для:

  • Колбэков (setTimeout, обработчики событий)
  • Методов в классах (как свойства)
  • Функций, передаваемых как аргументы
  • Когда нужен контекст из внешней области

Итог

Основная особенность: стрелочная функция не имеет собственного this, она наследует его из лексического окружения. Это делает код более предсказуемым и избавляет от необходимости использовать bind() или стрелочные функции внутри конструкторов.

В чем особенность взаимодействия this и стрелочной функции? | PrepBro