
В JavaScript ключевое слово this указывает на контекст выполнения функции. Его значение определяется не местом объявления функции, а способом её вызова. Именно поэтому одна и та же функция может возвращать разные результаты в зависимости от того, как она используется.
При вызове метода объекта this ссылается на сам объект. Если функция запускается без привязки, в строгом режиме она будет равна undefined, а в нестрогом – глобальному объекту window или global. В стрелочных функциях значение this не определяется собственным вызовом и наследуется из внешнего лексического окружения.
Точное понимание поведения this необходимо для корректного использования bind, call и apply, а также при работе с обработчиками событий и асинхронным кодом. Игнорирование этих особенностей часто приводит к ошибкам, особенно при передаче функций в качестве колбэков.
Как определяется this в глобальной области видимости
В глобальной области браузера значение this ссылается на объект window. Например, вызов console.log(this) вне функций вернёт объект окна со всеми его свойствами и методами.
В Node.js глобальный объект – это global, но в отличие от браузера this в модуле не указывает на него. Здесь this в верхнем уровне файла равен пустому объекту {}, который используется системой модулей.
При включённом strict mode в браузере и Node.js глобальный this становится undefined. Это предотвращает неявное создание глобальных переменных и делает поведение более предсказуемым.
Чтобы явно работать с глобальным объектом независимо от среды, рекомендуется использовать globalThis. Этот универсальный идентификатор доступен во всех современных окружениях и всегда указывает на глобальный объект.
this внутри методов объекта и потеря контекста

Когда метод вызывается через объект, значение this ссылается на сам объект:
const user = {
name: "Алексей",
getName() {
return this.name;
}
};
console.log(user.getName()); // "Алексей"
Если вынести метод в переменную или передать его как колбэк, привязка к объекту теряется:
const fn = user.getName;
console.log(fn()); // undefined
Причина в том, что this определяется способом вызова, а не местом объявления. Для сохранения контекста используют bind, стрелочные функции или явный вызов через call/apply:
const bound = user.getName.bind(user);
console.log(bound()); // "Алексей"
| Ситуация | Значение this |
|---|---|
| Метод вызывается через объект | Объект-владелец метода |
| Метод сохранён в переменной | undefined (в строгом режиме) |
| Метод передан как колбэк | undefined или глобальный объект |
| Использован bind | Фиксированный объект, переданный в bind |
Чтобы избежать ошибок при передаче методов, рекомендуется всегда явно контролировать контекст, а не полагаться на неочевидное поведение вызова.
Как работает this при вызове функции без объекта

При обычном вызове функции вне объекта значение this зависит от режима выполнения кода. В нестрогом режиме this ссылается на глобальный объект: в браузере это window, в Node.js – global. Таким образом, функция, вызванная без контекста, может непреднамеренно изменять глобальные данные.
В строгом режиме ('use strict') this внутри такой функции становится undefined. Это предотвращает случайные обращения к глобальной области и помогает быстрее выявлять ошибки.
Рекомендуется всегда использовать строгий режим или модульный код (ES-модули по умолчанию работают в строгом режиме), чтобы исключить неожиданное поведение. Если требуется явно указать контекст, используйте методы call, apply или bind.
Поведение this в стрелочных функциях

Стрелочные функции не создают собственный контекст выполнения. Значение this внутри них определяется лексически – оно берётся из окружающей области, где функция объявлена.
Внутри методов объектов использование стрелочной функции полезно, если требуется сохранить доступ к this внешнего метода, например при работе с колбэками:
const obj = {
value: 10,
log() {
setTimeout(() => console.log(this.value), 1000);
}
};
obj.log(); // 10
Если бы в примере использовалась обычная функция, this указывал бы на глобальный объект или undefined в строгом режиме.
Стрелочные функции не подходят для определения методов объектов или конструкторов, так как они не имеют собственного this и не могут использоваться с new:
const User = (name) => { this.name = name };
// TypeError при вызове new User("Alex")
Рекомендация: применять стрелочные функции только там, где важна передача текущего this из внешнего контекста, а не при создании методов или классов.
Использование call, apply и bind для управления this
Методы call, apply и bind позволяют явно задавать контекст выполнения функции. Это особенно важно при передаче методов как колбэков или при использовании функций в разных объектах.
-
call вызывает функцию с заданным
thisи аргументами, перечисленными через запятую:function greet(greeting, name) { console.log(greeting + ", " + name + " из " + this.city); } const obj = { city: "Москва" }; greet.call(obj, "Привет", "Аня"); -
apply работает аналогично
call, но принимает аргументы массивом. Это удобно при динамическом формировании списка аргументов:const args = ["Здравствуйте", "Игорь"]; greet.apply(obj, args); -
bind возвращает новую функцию с фиксированным
this. Она не выполняется сразу, а может быть вызвана позже:const boundGreet = greet.bind(obj, "Добрый день"); boundGreet("Мария");
Рекомендации:
- Используйте
call, если количество аргументов заранее известно и невелико. - Применяйте
applyпри работе с массивами данных, например при передаче параметров изargumentsили spread-оператора. - Фиксируйте контекст с помощью
bind, если функцию требуется многократно передавать как обработчик событий или колбэк.
this в конструкторах и классах

В конструкторах JavaScript значение this всегда указывает на создаваемый объект. При вызове конструктора через new автоматически создается новый объект, и this внутри функции ссылается на него. Это позволяет присваивать свойства и методы создаваемому экземпляру.
Пример конструктора:
function User(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log(`Привет, меня зовут ${this.name}`);
}
}
При создании объекта: const u = new User('Анна', 25);, this.name будет равен «Анна». Без new this ссылается на глобальный объект или undefined в строгом режиме, что вызывает ошибки.
В классах this работает аналогично, но синтаксис упрощает наследование и определение методов через прототип. Методы класса используют this для доступа к свойствам экземпляра, а стрелочные функции внутри класса сохраняют контекст внешнего this.
Пример класса:
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Привет, меня зовут ${this.name}`);
}
}
При наследовании this внутри конструктора дочернего класса указывает на новый объект дочернего типа, и необходимо вызвать super() перед доступом к this. Игнорирование super() приводит к ошибке ReferenceError.
Использование this в конструкторах и классах позволяет централизованно управлять свойствами экземпляров и корректно распределять методы между объектами и прототипами, обеспечивая безопасный доступ к данным и возможность расширения функциональности через наследование.
Особенности this в обработчиках событий браузера
В браузерных событиях значение this определяется контекстом, в котором функция была вызвана. Для стандартных обработчиков DOM this всегда указывает на элемент, к которому привязан обработчик.
- Если обработчик назначен через
element.onclick = function() {...},thisвнутри функции указывает наelement. - При использовании
addEventListenerповедение аналогично:thisуказывает на элемент, на котором произошло событие, а не на сам объект события. - Стрелочные функции не создают собственный
this. Если использовать стрелочную функцию как обработчик,thisбудет унаследован из внешнего контекста.
Практические рекомендации при работе с обработчиками событий:
- Для доступа к элементу, инициировавшему событие, лучше использовать
event.currentTarget, особенно если обработчик – стрелочная функция. - Для делегирования событий используйте
event.targetдля точного определения исходного элемента клика, ноthisостанется привязанным к родительскому элементу. - Если требуется сохранить ссылку на контекст внешнего объекта, используйте
bind()или сохраняйте ссылку в отдельной переменной перед определением обработчика. - Не полагайтесь на
thisвнутри стрелочной функции, если нужен конкретный DOM-элемент, используйте явное указание черезevent.currentTargetили переменные.
Примеры:
element.addEventListener('click', function(event) { console.log(this); });–thisравенelement.element.addEventListener('click', (event) => { console.log(this); });–thisиз внешнего лексического контекста.element.addEventListener('click', function(event) { console.log(event.currentTarget); });– всегдаelement, независимо от типа функции.
Как this ведёт себя в строгом режиме

В строгом режиме (`’use strict’`) значение `this` в функциях, вызванных без объекта, не автоматически ссылается на глобальный объект. Вместо этого оно остаётся `undefined`. Это предотвращает случайное создание глобальных переменных и ошибки, связанные с доступом к глобальному контексту.
Пример: в обычной функции `function foo() { console.log(this); }` вызов `foo()` выведет `window` в браузере. В строгом режиме тот же вызов выведет `undefined`.
Для методов объектов строгий режим не меняет поведение `this`: оно по-прежнему указывает на объект, через который вызывается метод. Однако внутри вложенных функций `this` снова станет `undefined`, если не применён `bind`, `call` или `apply`.
В конструкторах строгий режим сохраняет `this` как ссылку на создаваемый объект. Ошибка возникает только при попытке вызвать конструктор без `new`, так как `this` в этом случае будет `undefined` вместо глобального объекта.
Для стрелочных функций строгий режим не влияет на `this`. Оно всегда лексически заимствуется из окружающего контекста, независимо от того, включён ли строгий режим.
Рекомендации: включайте строгий режим в модуле или функции, чтобы избегать неявного связывания `this` с глобальным объектом. Для передачи контекста в функции используйте `bind`, `call` или стрелочные функции, чтобы точно контролировать значение `this`.
Вопрос-ответ:
Что означает `this` в обычной функции в JavaScript?
В обычной функции значение `this` определяется тем, как функция была вызвана. Если функция вызывается в глобальной области видимости, `this` ссылается на глобальный объект (в браузере это `window`). В строгом режиме `this` будет `undefined`. Если функция вызывается как метод объекта, `this` ссылается на сам объект, которому принадлежит метод.
Почему `this` ведет себя по-разному в стрелочных функциях?
Стрелочные функции не имеют собственного `this`. Они захватывают значение `this` из внешнего контекста, в котором были созданы. Это удобно для ситуаций, когда нужно сохранить ссылку на объект внутри вложенной функции, например, в обработчиках событий или колбэках, без необходимости использовать переменную типа `self`.
Как работает `this` внутри объекта с методами?
Когда метод объекта вызывается через сам объект, `this` ссылается на этот объект. Например, если есть `const obj = { name: «Alice», greet() { console.log(this.name); } };`, то вызов `obj.greet()` выведет «Alice». Но если метод будет извлечен и вызван отдельно, `this` перестанет указывать на исходный объект, а в строгом режиме станет `undefined`.
Что происходит с `this` в конструкторах и классах?
В конструкторах и классах `this` ссылается на создаваемый экземпляр. Когда вы используете `new`, создается новый объект, и `this` внутри конструктора автоматически указывает на него. Это позволяет устанавливать свойства и методы для конкретного экземпляра, например: `this.name = «Bob»;`.
Как изменить значение `this` вручную?
JavaScript позволяет явно задавать значение `this` с помощью методов `call`, `apply` и `bind`. `call` и `apply` вызывают функцию с указанным объектом в качестве `this`, различие лишь в способе передачи аргументов. `bind` возвращает новую функцию с закрепленным `this`, что удобно для передачи методов как колбэков, сохраняя привязку к нужному объекту.
