Выбор ответа Junior this, call, apply, bind спрашивают часто обновлено
Метод класса в setTimeout
Вопрос
Через секунду падает TypeError: Cannot read properties of undefined. Какая замена последней строки исправит ошибку?
class Clock {
ticks = 0;
tick() { this.ticks++; }
}
const clock = new Clock();
setTimeout(clock.tick, 1000);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: setTimeout(() = clock.tick(), 1000). Таймер вызывает переданную функцию без объекта, а тело класса строгое, поэтому this внутри tick равен undefined.
Варианты ответа
setTimeout(clock.tick.call(clock), 1000)setTimeout(clock.tick, 1000, clock)setTimeout(this.tick, 1000)setTimeout(() => clock.tick(), 1000)правильный ответ
Разбор
Таймер вызывает переданную функцию без объекта, а тело класса строгое, поэтому this внутри tick равен undefined. Стрелка-обёртка вызывает clock.tick() как метод, и this правильный; так же сработал бы clock.tick.bind(clock). call вызывает метод сразу, а в таймер уходит его результат undefined. Третий аргумент setTimeout передаётся в функцию как обычный аргумент, а не как this. this.tick на верхнем уровне ссылается вообще не на часы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.