2014-06-09 43 views
0

在下面的代碼中,檢查首先執行並將this.canClick設置爲false。然後resetClick在this.clickDelay秒後將this.canClick設置爲true。但是,再次調用檢查時不會看到更改。我在兩個函數中都記錄了this.canClick的值:resetClick記錄true,然後檢查同一個變量的記錄爲false。函數中的修改值在另一個函數中看不到

this.resetClick=function(){ 
    this.canClick=true; 
}; 
this.check=function(){ 
    if (isMouseDown&&this.canClick==true){ 
     if (mouse.x>=this.x-this.sizex/2 && mouse.x<=this.x+this.sizex/2 && mouse.y>=this.y-this.sizey/2 && mouse.y<=this.y+this.sizex/2){ 
      this.text=this.callback(); 
      this.canClick=false; 
      setTimeout(this.resetClick, this.clickDelay); 
     } 
    } 
}; 

我不相信這是一個規模問題,因爲兩者是同一個對象的成員函數,並且修改對象的屬性。此外,如果你想知道,這是一個函數,檢查按鈕是否被點擊,並做「反彈」,所以你不會錯誤地點擊兩次相同的按鈕。 編輯:重要的缺失信息:如果我只是調用resetClick,不使用setTimeout,它的工作原理。

+2

你用'setTimeout'運行對象範圍之外調用的方法,所以'this'將僅指在執行該方法時的全局窗口對象(這意味着'this.canClick'實際上是'window.canClick')。使用_closure_在對象內部保留'this'的值。 (做一些研究,如果你不知道這意味着什麼。) – CBroe

+0

謝謝@CBroe。您是否可以提交答案,以便訪問此頁面的人更容易看到解決方案? – rvcam

+0

秒,我想你的意思是毫秒? – shmosel

回答

1

這確實是一個範圍問題。 this函數內部沒有引用稍後將包含該函數的對象。 你應該與這一個簡單的技巧(TM)繞過它:使用別名this

var that = this; 
this.resetClick=function(){ 
    that.canClick=true; 
}; 
this.check=function(){ 
    if (isMouseDown&&that.canClick==true){ 
     if (mouse.x>=that.x-that.sizex/2 && mouse.x<=that.x+that.sizex/2 && mouse.y>=that.y-that.sizey/2 && mouse.y<=that.y+that.sizex/2){ 
      that.text=that.callback(); 
      that.canClick=false; 
      setTimeout(that.resetClick, that.clickDelay); 
     } 
    } 
}; 
1

你與setTimeout調用該方法的對象範圍之外運行,因此this只會引用全局窗口對象在執行該方法時(這意味着this.canClickwindow.canClick實際上)。

使用關閉將對象內部的值保存爲this

相關問題