class Game
foo: null
play: ->
@foo = 2
@animate()
animate: ->
requestAnimationFrame( @animate, 1000 )
console.log('foo = ', @foo)
$ ->
game = null
init = ->
game = new Game()
game.play()
init()
Game中的animate方法中的日志产生:
foo = 2
foo = undefined
所以foo在第一次调用动画时是2,然后是未定义的。有人可以解释为什么以及如何解决这个问题。非常感谢任何帮助。
答案 0 :(得分:11)
当您致电setInterval
时,上下文将丢失,第二次@
为window
。您需要使用fat-arrow方法来保留适当的this
:
animate: =>
答案 1 :(得分:5)
您可以按如下方式定义animate
:
animate: ->
callback = (=> @animate())
requestAnimationFrame(callback, 1000 )
console.log('foo = ', @foo)
这里的技术是获得绑定方法。 @animate
本身是未绑定,但(=> @animate())
是其绑定版本。
如果你使用UnderscoreJS,你可以得到类似的结果:
animate: ->
callback = _.bind(@animate, @)
requestAnimationFrame(callback, 1000 )
console.log('foo = ', @foo)
如果您使用的是更高版本的JavaScript,则可以执行以下操作:
animate: ->
callback = @animate.bind(@)
requestAnimationFrame(callback, 1000 )
console.log('foo = ', @foo)