Используйте стрелку внутри setTimeout либо привяжите обычный callback через bind(this). Тогда callback получит this метода delayedGetName1.
Настройка правильного контекста в функции setTimeout
Используйте стрелку внутри 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. Сам исправленный метод также нужно вызывать с правильным контекстом, не как оторванную ссылку.