2014-09-23 103 views
0

我想为这个游戏做一个定时器,每1000毫秒会从30秒开始倒计时,但是当我运行代码时,定时器确实会改变;它停留在30Javascript定时器不会改变状态

这里是代码我使用:

var gameTimer = { 
    time: 30, 
    interval: undefined, 
    start: function(time) { 
     var self = this; 
     this.interval = setInterval(tick, 1000); 
    }, 
    tick: function() { 
     this.time = this.time - 1; 
    }, 
    stop: function(time){ 
     clearInterval(this.interval); 
    }, 
    reset: function(){ 
     this.time = 30; 
    } 
}; 

是否有人可以帮助我吗?从这个

回答

0

变化:

this.interval = setInterval(tick, 1000); 

这样:

this.interval = setInterval(this.tick.bind(this), 1000); 

的问题是,当你通过tick给setInterval,当tick()被称为对象引用丢失,因此this有错误的价值。由于错误的this值,您最终可能会更改名为time的全局变量。

通过this.tick.bind(this)导致this指针被tick()由间隔调用时正确设置,因此该方法中的this.time引用正常工作。如果你在严格模式下工作,你的错误将会被运行时间指出给你,因为this本来是undefined,而不是window(严格模式的原因之一)。

0

像这样做,而不是

var gameTimer = function() { 
    this.time = 30; 
    this.interval; 

    this.start = function() { 
     self = this; 
     this.interval = setInterval(this.tick.bind(this), 1000); 
     console.log(this.interval); 
    }; 
    this.tick = function() { 
     console.log(this.time); 
     this.time = this.time - 1; 
    }; 
    this.stop = function(){ 
     clearInterval(this.interval); 
    }; 
    this.reset = function(){ 
     this.time = 30; 
    }; 
}; 
var timer = new gameTimer(); 
timer.start(); 

小提琴演示http://jsfiddle.net/jL2jc4jr/

在代码示例中,我并没有把代码塞,但我认为你可以做到这一点从在这一点上。享受你的游戏计时器。

相关问题