2012-07-07 29 views
5
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() 

Nhật ký trong phương pháp sinh động trong trò chơi sản xuất:biến Instance trở nên không xác định - CoffeeScript

foo = 2

foo = không xác định

Vì vậy foo là 2 về cuộc gọi đầu tiên để animate và sau đó không xác định sau đó. Ai đó có thể vui lòng giải thích lý do tại sao và làm thế nào tôi có thể sửa lỗi này. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

+0

'requestAnimationFrame' không lấy số làm đối số thứ hai; thay vào đó, nó gọi hàm ASAP đã cho (thường nhanh hơn 'setTimeout (func, 0)') với điều kiện là tab trình duyệt ở phía trước. Xem https://developer.mozilla.org/en/DOM/window.requestAnimationFrame –

Trả lời

11

Khi bạn gọi setInterval, ngữ cảnh bị mất và lần thứ hai @window. Bạn cần chất béo mũi tên phương pháp để giữ lại phù hợp this:

animate: => 
+0

Cảm ơn bạn đã trả lời. Điều này đã làm việc nhưng đã gây ra hành vi rất lạ với requestAnimationFrame. Tôi đang gọi requestAnimationFrame là nên được thực hiện nhưng với mũi tên chất béo nó là loại lặp lại cuộc gọi qua các cuộc gọi khác để requestAnimationFrame. –

+0

@ user881920 Sự lặp lại này là hành vi đúng đắn. Bạn nên chấp nhận câu trả lời của Aaron. Nếu bạn gặp sự cố với 'requestAnimationFrame', bạn nên đặt một câu hỏi riêng về nó. –

+0

Cảm ơn câu trả lời này. Đơn giản và rõ ràng. – Glenn

5

Bạn có thể xác định animate như sau:

animate: -> 
    callback = (=> @animate()) 
    requestAnimationFrame(callback, 1000) 
    console.log('foo = ', @foo) 

Kỹ thuật ở đây là để có được một phương pháp ràng buộc. @animate của chính nó là không bị ràng buộc, nhưng (=> @animate()) là phiên bản bị ràng buộc của nó.

Bạn có thể có được một kết quả tương tự nếu bạn đang sử dụng UnderscoreJS như sau:

animate: -> 
    callback = _.bind(@animate, @) 
    requestAnimationFrame(callback, 1000) 
    console.log('foo = ', @foo) 

Và nếu bạn đang sử dụng một phiên bản sau của JavaScript, bạn có thể làm như sau:

animate: -> 
    callback = @animate.bind(@) 
    requestAnimationFrame(callback, 1000) 
    console.log('foo = ', @foo) 
Các vấn đề liên quan