错误理解或错过使用JavaScript的SetTimeout功能

时间:2015-07-09 23:19:18

标签: javascript

我试图让一个函数每秒执行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/警告:可能会冻结您的浏览器!

1 个答案:

答案 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();
}