使用setInterval调用原型函数时出现问题
Issue with calling a prototype function with setInterval
我制作了一个Bot的原型类。我的问题是,在创建它之后,我调用它的init()。它在警报中正确地返回此值"a 5000"。然而,当该原型函数调用getUpdates()时,它不再达到该值并给出"b undefined"。我甚至试过这个。self=这个;在构造函数中,但没有运气。
经过努力,我发现在setInterval中的self.getUpdates调用上添加()使其正确地获得了值,然后是另一个问题,setInterval只循环一次。我试过创建一个setTimeout,并在getUpdates中调用它自己,但得到了"太多递归脚本.js:30:1"。有时我会得到"未捕获的异常:内存不足"
我最初使用的是"varprivateVars<->this.methods",没有太多问题,但后来改为"this.publicVars<->Class.protype.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();
如有任何帮助或建议,我们将不胜感激。但我认为,如果原型包括计时器,就不可能实现。
您必须将bind
和this
上下文正确地连接到函数引用
self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval);
若不显式绑定上下文,则getUpdates
内部的this
上下文将指向窗口。所以window.updateInterval
将是undefined
。
您可以使用bind
在getUpdates
函数中设置this
上下文:
self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval);
工作示例
您可以将Bot的this
引用发送到getUpdates函数。
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);
});
};
相关文章:
- IE9的HTML5 Canvas getImageData()函数存在问题
- javascript中的特定函数出现问题
- 运行Infinite Scroll后调用函数时出现问题
- jQuery使用ajax自动完成问题-TypeError:this.source不是函数
- 将代码放入click函数时出现javascript问题
- 使用setInterval调用原型函数时出现问题
- 在HTML中调用函数时出现问题
- 异步中的回调函数出现问题'张贴'
- Jquery函数返回订单问题
- 带有 JavaScript 随机数函数的未知问题
- 关于函数的Javascript问题 - IIFE
- 作用域问题-此函数是否形成闭包-JavaScript
- 用于异步函数中的循环和定时问题
- Createjs冲突问题localToLocal不是函数错误
- 使用Breeze脱机数据时出现未定义的问题不是函数
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- Javascript函数变量传递语法问题
- 函数范围问题-函数未定义
- Javascript作用域问题:函数在$(doc).ready()中可用,但在事件处理程序中不可用
- 实现“喜欢”功能的问题.函数只工作一次