2013-10-16 86 views
0

我在JavaScript中有一個對象。對象中的方法是從對象外部調用的。我希望這種方法在200ms後調用自己(遞歸類型,但不完全),直到滿足條件。我在函數中沒有定義

this.setSearchResult = function(data){ 
    if(initiated){ 
     doSetSearchResult(data); 
    }else{ 
     console.log("Map is not initiated yet. Waiting 200 ms"); 
     setTimeout(function(){setSearchResult(data);}, 200); // <- Error 
    } 
} 

調用setSearchResult做是這樣的:

mapView = new MapView(imageData); 
mapView.setSearchResult(data); 

我得到的錯誤是ReferenceError: setSearchResult is not defined.

一個克服錯誤的方法是通過改變setTimeout調用此:

setTimeout(function(){mapView.setSearchResult(data);}, 200); 

但我覺得很醜陋(儘管它可能會工作在 我的應用程序)。

有沒有正確的方法呢?我是否必須在setSearchResult中使用setTimeout?

回答

2

我認爲這應該工作:

this.setSearchResult = function(data){ 
    if(initiated){ 
     doSetSearchResult(data); 
    }else{ 
     var _this = this; 

     console.log("Map is not initiated yet. Waiting 200 ms"); 
     setTimeout(function(){_this.setSearchResult(data);}, 200); // <- Error 
    } 
} 

這是因爲你在一個回調函數,所以你不必訪問setSearchResult功能。

1

setSearchResult是你的MapView對象的方法。因此你必須這樣稱呼它。在方法本身內部,您可以使用關鍵字this來引用方法所屬的對象。

如果您直接在方法中使用this.setSearchResult,它將會起作用。但在你的setTimeout回調函數中使用它,它會引用window對象,因爲setTimeoutwindow的一種方法。要解決此問題,請將this存儲在另一個變量中,並使用它指向正確的對象。

// Store this in a variable called self 
var self = this; 

setTimeout(function() { 
    // Inside this function "this" points to window, because setTimeout 
    // is a method of window. Use the previously declared self instead. 
    self.setSearchResult(data); 
}, 200); 
+0

謝謝你的解釋。它真的幫助我理解。 –

相關問題