Это:
setInterval(this.tick, 1000 / 30);
Должно быть:
var that = this;
setInterval(function () { that.tick(); }, 1000 / 30);
или поочередно:
setInterval(this.tick.bind(this), 1000 / 30);
Объяснение: привы просто передаете this.tick
, это то же самое, что и следующее:
var temp = this.tick;
setInterval(temp, 1000 / 30);
Но теперь, когда вызывается temp
, JavaScript не знает, каким должен быть указатель this
;эта информация теряется, и в конечном итоге она привязывается к глобальному объекту (window
) или null
, если вы находитесь в строгом режиме.
Так что вам нужно каким-то образом убедиться, что this.tick
вызывается как метод с соответствующим указателем this
.Есть два способа сделать это:
- Обернув его в замыкание, которое захватывает
var that = this
, вы можете правильно вызвать that.tick
как метод исходного указателя this
. - Или,
bind()
переводя функцию this.tick
в this
, вы гарантируете, что она вызывается как метод с соответствующим this
каждый раз: другими словами, вы даже можете сделать var temp = this.tick.bind(this)
и setInterval(temp, 1000 / 30)
.
Обратите внимание, что bind
недоступно в старых браузерах (особенно IE <= 8 и всех Safaris до 5.1 включительно), в этом случае вам понадобится что-то вроде <a href="https://github.com/kriskowal/es5-shim" rel="nofollow"> ES5-регулировочная шайба .