При передачи функции в setTimeout, контекст будет потерян,и теперь this будет равен не новому объекту, а будет равен undefined.
Поэтому если не использовать какой нибудь метод сохранения контекста, работать ничего не будет.
Например если в функции не использовать метод с сохранением контекста в переменную в замыкании, а просто писать this.метод то будет ошибка.
function getBoilTime() {
return this.waterAmount * WATER_HEAT_CAPACITY * 80 / power;
}
В данном случае, this будет не новый объект, а будет равен undefined.
поэтому вызов undefined.метод приведет к ошибке.
Для решения данной проблемы используют неявный вызов с call/apply, сохранение контекста в новую переменную как в этом случае, или функцию bind, которая позволяет сохранить контекст для функции.
Ссылки:
Потеря контекстаПривязка контекста при помощи bindcall/applyСохранение контекста (habrahabr)