Настройка правильного контекста в функции setTimeout

Используйте стрелку внутри setTimeout либо привяжите обычный callback через bind(this). Тогда callback получит this метода delayedGetName1.

Короткий ответ

Что ответить на собеседовании

Используйте стрелку внутри setTimeout либо привяжите обычный callback через bind(this). Тогда callback получит this метода delayedGetName1.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо изменить реализацию метода delayedGetName1, чтобы внутри него вызов this.getName() корректно получал имя объекта и выводил строку "EPAM".

(() => {
  const obj = {
    name: "EPAM",
    getName() {
      return this.name;
    },
    delayedGetName1() {
      setTimeout(function () {
        console.log("1:", this.getName());
      }, 1000);
    },
    delayedGetName2() {
      setTimeout(() => {
        console.log("2:", this.getName());
      }, 1000);
    }
  };

  obj.delayedGetName1();
  obj.delayedGetName2();
})();

Ответ

Используйте стрелку внутри setTimeout либо привяжите обычный callback через bind(this). Тогда callback получит this метода delayedGetName1.

Замена тела метода:

delayedGetName1() {
  setTimeout(() => console.log('1:', this.getName()), 1000);
}

При obj.delayedGetName1() внешнее this равно obj, поэтому будет напечатано 1: EPAM. Сам исправленный метод также нужно вызывать с правильным контекстом, не как оторванную ссылку.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее