Uncaught TypeError: this.clearBoard не является функцией

Давайте рассмотрим следующий код

Выполнение приведенного выше кода приводит к следующей ошибке:

Uncaught TypeError: this.clearBoard is not a function

Почему? Все дело в контексте. Причина, по которой вы получаете эту ошибку, заключается в том, что когда вы вызываете setTimeout(), вы фактически вызываете window.setTimeout(). В результате анонимная функция, передаваемая setTimeout(), определяется в контексте объекта window, у которого нет метода clearBoard().

Традиционное решение, совместимое со старыми браузерами, состоит в том, чтобы просто сохранить вашу ссылку на this в переменной, которая затем может быть унаследована замыканием, например:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    const self = this;   // Save reference to 'this', while it’s still this!
    this.timer = setTimeout(function(){
        self.clearBoard();    // Oh, OK, I do know who 'self' is!
    }, 0);
};

Кроме того, в более новых браузерах вы можете использовать метод bind() для передачи правильной ссылки:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    this.timer = setTimeout(this.reset.bind(this), 0);  // Bind to 'this'
};

Game.prototype.reset = function(){
    this.clearBoard();    // OK, back in the context of the right 'this'!
};