我试图让一个函数每秒执行4次,但我知道这不会100%精确,因为它不会考虑函数的执行时间,但我管理与预期完全不同的结果。
CODE:
var ClassObject = {
myInteger: 0,
running: false,
paint: function() {
this.myInteger++;
console.log(this.myInteger);
if(this.running) {
setTimeout(this.paint(), 250); // 250ms wait
}
},
start: function() {
this.running = true;
this.paint();
},
stop: function() {
this.running = false;
}
}
ClassObject.start();
然而,结果是荒谬的,循环运行如此之快,我的计算机几乎崩溃,并且创建了如此多的垃圾,一旦达到80%的CPU使用率,几乎无法逃脱该过程6GB的RAM。超过约2秒的执行时,控制台打印的值超过13k。不应该坐在8左右吗?
不完全确定我做错了什么。
这是一个JSFiddle:http://jsfiddle.net/3Lq9t1by/(警告:可能会冻结您的浏览器!)
答案 0 :(得分:1)
您使用paint
调用()
,而不是将对它的引用传递到 setTimeout 。您可能还需要在使用this
时绑定它或其他内容,当 setTimeout 调用它时它将丢失
function () {
this.myInteger++;
console.log(this.myInteger);
if(this.running) {
setTimeout(this.paint.bind(this), 250); // 250ms wait
}
}
但是请注意,这将每次创建一个新的函数实例,在paint中定义另一个函数可能更有效,它实际上是循环,因为你可以只绑定它一次
function () {
var looper = function () {
this.myInteger++;
console.log(this.myInteger);
if(this.running) {
setTimeout(looper, 250);
}
}.bind(this);
looper();
}