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