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

Что такое this в JavaScript и как он определяется в разных контекстах?

2.0 Middle🔥 221 комментариев
#JavaScript Core

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

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

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

Что такое this в JavaScript

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

Основные правила определения this

1. this в глобальной области видимости

В глобальном контексте (за пределами любой функции) this ссылается на глобальный объект. В браузерах это window, в Node.js — global.

console.log(this === window); // В браузере: true
var globalVar = 'test';
console.log(this.globalVar); // 'test'

2. this в обычной функции (function declaration/expression)

При вызове обычной функции (не стрелочной) значение this определяется по правилу «как вызвана функция»:

  • Если функция вызвана как метод объекта (obj.method()), this ссылается на этот объект.
  • Если функция вызвана как самостоятельная функция (func()), this будет либо undefined (в строгом режиме), либо глобальный объект (без строгого режима).
function regularFunc() {
    console.log(this);
}

const obj = {
    method: regularFunc
};

// Вызов как метода объекта
obj.method(); // this === obj

// Вызов как самостоятельной функции
regularFunc(); // В строгом режиме: undefined, без строгого режима: window

3. this в стрелочной функции (arrow function)

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

const obj = {
    value: 'my value',
    regularMethod: function() {
        console.log(this.value); // 'my value'
        
        const arrowFunc = () => {
            console.log(this.value); // Также 'my value' — наследует this из regularMethod
        };
        arrowFunc();
    },
    arrowMethod: () => {
        console.log(this.value); // undefined — наследует this из глобального контекста
    }
};

obj.regularMethod();
obj.arrowMethod();

4. this в конструкторах и классах

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

function Person(name) {
    this.name = name;
}
const person = new Person('John');
console.log(person.name); // 'John'

В классах ES6 поведение аналогично: this в методах класса ссылается на экземпляр класса.

class Car {
    constructor(model) {
        this.model = model;
    }
    
    showModel() {
        console.log(this.model);
    }
}
const car = new Car('Toyota');
car.showModel(); // 'Toyota'

5. this при явном связывании (bind, call, apply)

JavaScript предоставляет методы для явного управления значением this:

  • call() и apply() — сразу вызывают функцию с указанным this и аргументами.
  • bind() — создает новую функцию с «привязанным» (hard-bound) значением this, которое не может быть изменено.
function greet(greeting) {
    console.log(`${greeting}, ${this.name}`);
}

const user = { name: 'Alice' };

// call — передаём this и аргументы отдельно
greet.call(user, 'Hello'); // Hello, Alice

// apply — передаём this и аргументы как массив
greet.apply(user, ['Hi']); // Hi, Alice

// bind — создаём функцию с постоянным this
const boundGreet = greet.bind(user);
boundGreet('Welcome'); // Welcome, Alice

6. this в событиях и DOM-обработчиках

В обработчиках событий DOM, если обработчик является обычной функцией, this ссылается на элемент DOM, на котором произошло событие.

document.getElementById('myButton').addEventListener('click', function() {
    console.log(this); // Ссылается на элемент #myButton
});

Но если использовать стрелочную функцию, this будет наследоваться из окружающего контекста и не будет ссылаться на элемент DOM.

Итог и практические советы

  • Основное правило: this определяется контекстом вызова, а не объявления.
  • Стрелочные функции фиксируют this лексически — это часто решает проблемы с потерей контекста в колбэках.
  • Для явного контроля используйте bind, call, apply.
  • В современных проектах с классами и компонентами (React, Vue) понимание this критически важно для работы с методами и обработчиками событий.

Понимание механизма this требует практики, но после освоения оно становится мощным инструментом для создания гибкого и чистого кода в JavaScript.