Обычный callback первого таймера теряет контекст entity и обычно вызывает TypeError. Стрелка второго сохраняет this метода и может вывести 2: EPAM.
Поведение this в обычной и стрелочной функции внутри setTimeout
Обычный callback первого таймера теряет контекст entity и обычно вызывает TypeError. Стрелка второго сохраняет this метода и может вывести 2: EPAM.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой вывод появится в консоли после выполнения приведённого ниже скрипта?
(() => {
const entity = {
companyName: "EPAM",
fetchName() {
return this.companyName;
},
delayedFetch1() {
setTimeout(function () {
console.log("1:", this.fetchName());
}, 1000);
},
delayedFetch2() {
setTimeout(() => {
console.log("2:", this.fetchName());
}, 1000);
}
};
entity.delayedFetch1();
entity.delayedFetch2();
})();
Ответ
Обычный callback первого таймера теряет контекст entity и обычно вызывает TypeError. Стрелка второго сохраняет this метода и может вывести 2: EPAM.
В браузере ошибка первого таймера обычно не мешает отдельной второй задаче. В Node.js необработанное исключение по умолчанию завершает процесс, поэтому второй вывод может не состояться. Исправление первого callback — стрелка или bind(this).