2012-02-06 57 views
2

我正在用Javascript構建一個簡單的遊戲引擎,並且我碰到了一個名爲「所有函數都是對象類」的牆。關於Javascript中變量可見性的困惑

更具體地說,我有類

function Game(){ 

} 

Game.prototype = { 
update: function(){/* Blah */}, 
draw: function(){/* Foo */}, 

start: function(fps){ 
     //Just a global var where I keep the FPS 
     GS.fps = fps; 
     var start = new Date().getTime(); 
     var time = 0; 
     function timer(){ 
      time += (1000/fps); 
      var diff = (new Date().getTime() - start) - time; 
      if(true) 
      { 
       //Execute on itteration of the game loop 
       this.update(); //It breaks here because this. is timer, not G.Game 

       //Draw everything 
       this.draw(); 

       window.setTimeout(timer,(1000/GS.fps - diff)); 

      }   
     }; 

} 

我想用全局對象作爲更新容器和借鑑作用,但這只是覺得我錯了...是否有任何其他方式?有沒有一種原生的JS訪問父類的方式?

謝謝你的時間!

+3

'如果(真)'.... – jAndy 2012-02-06 22:06:17

+0

我敢肯定這無關我的js OOP ... – Loupax 2012-02-06 22:08:28

回答

2

這裏的問題是,您正在使用回調,就好像它是一個成員函數。如您所示,這將會中斷,因爲回調以this的不同值執行。如果您想在回調中使用原始this,則需要將其存儲在本地並在回調中使用該本地。

var self = this; 
function timer(){ 
    time += (1000/fps); 
    var diff = (new Date().getTime() - start) - time; 
    if(true) 
    { 
    //Execute on itteration of the game loop 
    self.update(); 
    self.draw(); 
    etc ... 
    } 
}; 
+0

咦,它的工作!有一段時間我以爲它會給我同樣的錯誤,因爲我認爲自我的類型會更新,但我可以訪問更新就好!謝謝! – Loupax 2012-02-06 22:15:41