Потеря контекста при передачи в другую функцию

Есть класс консруктор с несколькими методами.

class AlarmClock {
  constructor() {
    this.alarmCollection = [];
  } 

addClock(time, func, id) {
        let item = { id: id, time: time, callback: func };
        this.alarmCollection.push(item);
        console.log("Будильник взведен");
  }

  start() {
    let timerId = () => setInterval(this.checkClock(), 0); //неправильная передача данных
    this.alarmCollection.forEach(function (item) {
      console.table(item);
      timerId(item, 0);
    });
  }

  checkClock(item) {
    let data = "09:01";
    console.log(item);
    if (data == item.time) {
      item.callback();
    }
    return "Вызов успешный";
  }

} 

Создаем новый объект и запускаем несколько методов

let phoneAlarm = new AlarmClock();
phoneAlarm.addClock("09:00", () => console.log("Пора вставать"), 1);
phoneAlarm.addClock("09:01", () => console.log("Давай, вставай уже!"), 2);
phoneAlarm.start();

Проблема заключается в потере конкекста при вызове метода checkClock из start. Пробовал с call как-то это решить, но так и не смог.


Ответы (2 шт):

Автор решения: Pavel Nazarian

Только зачем в timerId присваивать функцию? Название переменной странное.

start() {
    let timerId = (_item, timer) => setInterval(()=>this.checkClock(_item), timer);  
    this.alarmCollection.forEach(function (item) {
      console.table(item);
      timerId(item, 2000);
    });
  }
→ Ссылка
Автор решения: Виктор

Вот так надо:

class AlarmClock {
  constructor() {
    this.alarmCollection = [];
  } 

  addClock(time, func, id) {
        let item = { id: id, time: time, callback: func };
        this.alarmCollection.push(item);
        console.log("Будильник взведен");
  }

  start() {
    this.alarmCollection.forEach(
    (item) => {
      console.table(item);
      setInterval(() => this.checkClock(item), 1000);
    });
  }

  checkClock(item) {
    console.log("checkClock",item);
    item.callback();
  }
} 

let phoneAlarm = new AlarmClock();
phoneAlarm.addClock("09:00", ()=> console.log("Пора вставать"), 1);
phoneAlarm.addClock("09:01", ()=> console.log("Давай, вставай уже!"), 2);
phoneAlarm.start();
→ Ссылка