我也跟着教程创建一个JavaScript秒表,我试图扩大它与多个秒表(一类的多个实例)工作。 我的问题是,当我试图在时钟滴答作响,我需要硬编码的类实例becasue使用“这个”不工作(就行了,我现在用的console.log)来显示当前值。 我已经削减了代码到最小,试图了解这方面的,并贴上我有什么如下:
function Timer(){
var time1 = null;
var time2 = null;
var timeLoop = null;
function getTime(){
var day = new Date();
return day.getTime();
}
this.start = function(){
time1 = getTime();
timeLoop = setInterval(function(){
time2 = getTime();
console.log(_Timer.duration());
//console.log(this.duration());
},500);
}
this.duration = function(){
return (time1 - time2) / 1000;
}
}
我想下面的链接描述了我的问题,但我不明白它足以在这里应用它。 是问题,由于业主是this.start而不是仅仅这一点,我怎么能ammend代码,使其与定时器的任何实例工作?
http://www.quirksmode.org/js/this.html
我既包括硬编码值线和不工作的“本”线。
谢谢,
杰兰特
如果你想拥有this
属性是一致的,我们应该绑定正在调用的函数。
例如,
setInterval(function() { /* code here */ }.bind(this), 500)
通过这种方式, this
内部函数将是相同的外功能。
每当你看到function
,你可以假设值this
变化,所以间隔的回调函数内this
实际上是window
,而不是对象。
最简单的解决方法就是保存this
在一个变量
function Timer(){
var time1 = null;
var time2 = null;
var timeLoop = null;
function getTime(){
var day = new Date();
return day.getTime();
}
this.start = function(){
var self = this;
time1 = getTime();
timeLoop = setInterval(function(){
time2 = getTime();
console.log(self.duration());
},500);
}
this.duration = function(){
return (time1 - time2) / 1000;
}
}
this
是不是一个局部变量,因此它不会保存在关闭。 您需要分配一个本地变量:
this.start = function(){
var self = this;
time1 = getTime();
timeLoop = setInterval(function(){
time2 = getTime();
console.log(self.duration());
},500);
}
尝试:
function Timer(){
var time1 = null;
var time2 = null;
var timeLoop = null;
var _this = this;
function getTime(){
var day = new Date();
return day.getTime();
}
this.start = function(){
time1 = getTime();
timeLoop = setInterval(function(){
time2 = getTime();
console.log(_this.duration());
},500);
}
this.duration = function(){
return (time1 - time2) / 1000;
}
}
首先第一件事情。 JavaScript不支持基于类的OOP。 这是OOP连同它的继承原型。
以下是如何实现你的计时器例如原型OOP特性的例子:
function Timer(){
var time1 = null;
var time2 = null;
var timeLoop = null;
}
Timer.prototype.getTime = function(){
var day = new Date();
return day.getTime();
}
Timer.prototype.start = function(){
time1 = this.getTime();
timeLoop = this.setInterval(function(){
time2 = this.getTime();
console.log(this.duration());
}.bind(this),500);
}
Timer.prototype.duration = function(){
return (time1 - time2) / 1000;
}
看的自定义对象部分MDN的Javscript放归
有没有错,它是在教程中的显示方式。 这只是这是一个更清洁的方式和bind
只需要呼叫console.log
语句,否则将关联this
作为window
。 如果您摆脱它,你可以摆脱的bind
了。