Выбор ответа 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.

Варианты ответа

  1. setTimeout(clock.tick.call(clock), 1000)
  2. setTimeout(clock.tick, 1000, clock)
  3. setTimeout(this.tick, 1000)
  4. setTimeout(() => clock.tick(), 1000)правильный ответ

Разбор

Таймер вызывает переданную функцию без объекта, а тело класса строгое, поэтому this внутри tick равен undefined. Стрелка-обёртка вызывает clock.tick() как метод, и this правильный; так же сработал бы clock.tick.bind(clock). call вызывает метод сразу, а в таймер уходит его результат undefined. Третий аргумент setTimeout передаётся в функцию как обычный аргумент, а не как this. this.tick на верхнем уровне ссылается вообще не на часы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.