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