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

На что указывает This?

2.0 Middle🔥 151 комментариев
#Soft Skills и рабочие процессы

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

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

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

Ответ на вопрос «На что указывает This?»

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

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

1. Вызов в глобальном контексте (Global Context)

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

function showThis() {
    console.log(this);
}

showThis(); // В браузере выведет объект Window

2. Вызов как метода объекта (Method Invocation)

Когда функция вызывается как метод объекта, this указывает на объект, которому принадлежит этот метод.

const user = {
    name: 'Анна',
    greet() {
        console.log(`Привет, я ${this.name}`);
    }
};

user.greet(); // Выведет: "Привет, я Анна"
// Здесь this внутри greet() — это объект user.

3. Вызов с new (Constructor Invocation)

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

function Person(name) {
    this.name = name;
}

const alex = new Person('Алексей');
console.log(alex.name); // "Алексей"
// В момент new Person(...), this внутри конструктора — это новый пустой объект,
// который затем заполняется свойствами и возвращается.

4. Явное указание (Explicit Binding)

Значение this можно явно задать с помощью методов call(), apply() или bind().

function introduce(age) {
    console.log(${this.name}, мне ${age} лет`);
}

const person = { name: 'Мария' };

// call и apply вызывают функцию с указанным значением this
introduce.call(person, 30);   // Выведет: "Я Мария, мне 30 лет"
introduce.apply(person, [30]); // То же самое

// bind создаёт новую функцию с навсегда привязанным this
const boundIntroduce = introduce.bind(person);
boundIntroduce(30); // Также выведет: "Я Мария, мне 30 лет"

5. Стрелочные функции (Arrow Functions)

Стрелочные функции (=>) не имеют своего this. Они захватывают значение this из окружающего лексического контекста на момент их создания.

const obj = {
    value: 42,
    regularFunc: function() {
        console.log(this.value); // Указывает на obj
    },
    arrowFunc: () => {
        console.log(this.value); // Указывает на this внешнего контекста (например, window)
    }
};

obj.regularFunc(); // 42
obj.arrowFunc();   // undefined (если внешний контекст — глобальный, у window нет свойства value)

Ключевые моменты для запоминания

  • this определяется при вызове, а не при объявлении функции.
  • В строгом режиме ('use strict'), this в глобальном контексте и функциях, вызванных без контекста, будет undefined, а не глобальный объект. Это помогает избежать ошибок.
  • Методы call, apply, bind — мощные инструменты для управления контекстом.
  • Стрелочные функции используют лексический this. Это делает их идеальными для использования внутри колбэков, где нужно сохранить контекст внешней функции (например, в обработчиках событий или промисах).

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

На что указывает This? | PrepBro