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'!
};