2016-05-11 41 views
0

我製作了一個Bot類的原型。我的問題是,在我創建它之後,我把它稱爲init()。它在警報中正確地返回該值「a 5000」。然而,當那個原型函數調用getUpdates()時,它不再達到這個值並給出「b undefined」。我甚至試過this.self = this;在構造函數中,但沒有運氣。使用setInterval調用原型函數的問題

掙扎之後,我發現在setInterval中的self.getUpdates調用中添加()使得它正確得到值,然後出現另一個問題,setInterval只循環一次。我嘗試了setTimeout,並在getUpdates中調用它自己,但得到了「遞歸過多script.js:30:1」。我有時得到了「未捕獲的異常:內存不足」

我最初使用「var privateVars < - > this.methods」沒有太多問題,但切換到「this.publicVars < - > Class.prototype.methods」因爲我讀過他們應該更快,更少的內存,但這種原型方法給我的問題。我試過瀏覽谷歌,但沒有運氣。我寧願在init()上啓動計時器。

這裏是我的代碼:

var Bot = function() { 
    "use strict"; 
    this.updateInterval = 5000; 
    this.updateTimer = null; 
}; 
Bot.prototype.getUpdates = function() { 
    "use strict"; 
    var self = this; 
    alert("b " + self.updateInterval); // returns "b undefined" 
}; 
Bot.prototype.init = function() { 
    "use strict"; 
    var self = this; 
    $.get(/* pretend url is here*/, function (data, status) { 
     alert("a " + self.updateInterval); // returns "a 5000" 
     self.updateTimer = setInterval(self.getUpdates, self.updateInterval); 
    }); 
}; 
window.bot = new Bot(); 
window.bot.init(); 

任何幫助或建議,將不勝感激。但是我認爲如果包含定時器的話,原型並不適用。

回答

1

你要好好bindthis上下文功能參考,

self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval); 

如果不綁定上下文明確那麼getUpdatesthis上下文將指向窗口。所以window.updateInterval將是undefined

0

您可以使用bind設置this上下文您getUpdates功能:

self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval); 

Working example

0

您可以發送到getUpdates功能博特this參考。

Bot.prototype.getUpdates = function (self) { 
    "use strict"; 
    alert("b " + self.updateInterval); 
}; 
Bot.prototype.init = function() { 
    "use strict"; 
    var self = this; 
    $.get(/* pretend url is here*/, function (data, status) { 
     alert("a " + self.updateInterval); 
     self.updateTimer = setInterval(self.getUpdates(self), self.updateInterval); 
    }); 
}; 
+0

兩個@Rajaprabhu Aravindasamy和@Razzi Abuissa答案幫助解決問題,沒想到回覆這麼快,謝謝。然而,@Ramin答案沒有工作,setInterval只爲我觸發一次,但感謝嘗試。有沒有其他的方式來訪問類的原型方法,並且這個值就像一個set root,而不是假設'window'?說在多個函數內部被調用,但仍然知道'this'是指或者如果可能沒有它? – Nova

+0

這就對了@Nova,最好的方式是Rajaprabhu和Razzi如何提出這樣的建議,以便將Bot函數引用發送到所有其他函數沒有任何開銷。豎起大拇指給他們。然而,對於你的情況,如果你想從任何地方訪問Bot函數引用,那麼你可以將它的引用賦值給窗口對象中的變量,就像這個'window.botReference = this;'在Bot函數內部。 – Ramin