2016-05-11 40 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