логотип PurpleSchool
Иконка входа
Вход
  • Обучение
  • Войти
логотип PurpleSchool

Ключевое слово this в JavaScript

Автор

Дмитрий Нечаев

Ключевое слово this является одним из часто задаваемых вопросов на собеседованиях по JavaScript. Понимание контекста и использование this являются важными навыками для любого JavaScript-разработчика. Давайте рассмотрим this подробно и разберёмся в его нюансах.

Контекст выполнения

Контекст выполнения (или просто контекст) определяет, как функция была вызвана и какие переменные окружают её в момент вызова. Значение this зависит от контекста, в котором была вызвана функция.

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

В глобальной области видимости this ссылается на объект window в браузере и на объект global в среде выполнения Node.js.

console.log(this === window); // Выведет true в браузере

this в функции

В большинстве случаев this в функции ссылается на объект, который вызывает эту функцию. Если функция вызывается как метод объекта, то this ссылается на сам объект.

const person = {
  name: "Иван",
  greet: function() {
    console.log("Привет, " + this.name + "!");
  }
};

person.greet(); // Выведет "Привет, Иван!"

Проблема контекста

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

const person = {
  name: "Иван",
  greet: function() {
    setTimeout(function() {
      console.log("Привет, " + this.name + "!"); // Здесь this не ссылается на объект person
    }, 1000);
  }
};

person.greet(); // Выведет "Привет, undefined!" из-за потери контекста

Решение проблемы с this

Чтобы избежать потери контекста, можно использовать стрелочные функции, которые не создают свой собственный контекст и заимствуют контекст родительской функции.

const person = {
  name: "Иван",
  greet: function() {
    setTimeout(() => {
      console.log("Привет, " + this.name + "!"); // Здесь this ссылается на объект person
    }, 1000);
  }
};

person.greet(); // Выведет "Привет, Иван!" из-за использования стрелочной функции

this в конструкторах

В конструкторах this ссылается на новый созданный экземпляр объекта, который создаётся при вызове конструктора с помощью оператора new.

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

const ivan = new Person("Иван");
console.log(ivan.name); // Выведет "Иван"

this в методах объекта

В методах объекта this ссылается на сам объект, на котором вызывается метод.

const car = {
  brand: "Toyota",
  drive: function() {
    console.log("Едем на машине " + this.brand);
  }
};

car.drive(); // Выведет "Едем на машине Toyota"

Заключение

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

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile