1. Что такое this и контекст выполнения
Что такое this и контекст выполнения
Ключевое слово this — одна из самых частых причин ошибок и непонимания в JavaScript. Главная причина в том, что this не привязано к функции навсегда: его значение зависит от того, как именно была вызвана функция.
В этой статье мы разберём базовые понятия:
this простыми словамиthisthis в одном и том же коде может быть разнымЧто такое this
this — это ссылка на объект, который связан с текущим выполнением функции.
Важно: this — не переменная, которую вы объявляете сами. Это специальное значение, которое движок JavaScript подставляет при вызове.
Два ключевых факта:
this определяется в момент вызова функции, а не в момент её объявления.this зависит от способа вызова (call-site).Официальная справка: MDN: this
Контекст выполнения
Когда JavaScript выполняет код, он делает это не “в вакууме”, а внутри структуры, которую обычно называют контекстом выполнения.
Контекст выполнения можно понимать как “пакет параметров”, который движок создаёт, чтобы выполнить определённый фрагмент кода.
Обычно в контекст выполнения входят:
thisКонтексты выполнения создаются, например:
!Контексты выполнения добавляются в стек при вызове функций и убираются при завершении
Глобальный контекст и this
В самом верхнем уровне выполнения (в глобальном контексте) значение this зависит от среды и режима.
Браузер
В обычном скрипте (не модуль) в браузере глобальный this обычно указывает на window.
Node.js
В Node.js поведение отличается: на верхнем уровне файла this не равен глобальному объекту.
Чтобы получить универсальную ссылку на глобальный объект, используйте globalThis:
Главное правило: this зависит от способа вызова
Один и тот же код функции может получить разный this.
Сравните:
И:
Снаружи функция похожа, но “место вызова” разное — значит, и this будет разным.
Типичные способы вызова и что будет this
Ниже — самые важные случаи, которые нужно запомнить в начале курса.
Вызов как обычной функции
Когда функция вызывается “просто по имени” (или через переменную, в которой лежит функция), this зависит от режима:
this обычно становится глобальным объектом (в браузере — window)this будет undefinedСтрогий режим: MDN: strict mode
Почему так сделано: строгий режим помогает избегать ошибок, когда вы случайно используете this, думая, что он “куда-то указывает”, хотя функция вызвана без объекта.
Вызов как метода объекта
Если функция вызывается как метод объекта, то есть стоит справа от точки, this будет ссылаться на объект слева от точки.
Ключевая идея: важна не “где функция объявлена”, а “как она вызвана”.
Потеря this при “отрыве” метода
Очень частая ошибка: метод вытащили в переменную, а потом вызвали как обычную функцию.
Здесь fn() — обычный вызов функции. Значит, правило “метода” больше не работает.
Стрелочные функции и this
Стрелочные функции (() => {}) ведут себя иначе: у них нет собственного this.
Они берут this из внешнего окружения (часто говорят: лексически захватывают this).
Важно понять: стрелка не создаёт новый this. Она использует this того контекста, в котором была создана.
Итоги
this — это значение, которое движок подставляет при вызове функции.this определяется в момент вызова и зависит от формы вызова.this.this === undefined.obj.method()) даёт this === obj.this: они берут его снаружи.В следующей статье мы систематизируем правила привязки this и разберём больше практических кейсов, где this “ломается” и как это исправлять.