【发布时间】:2012-04-17 09:53:45
【问题描述】:
在阅读了 Douglas Crockford 的“JavaScript: The Good Parts”之后,我尝试实现这样的计时器。它有私有变量(秒、小时、分钟)和三个公共方法:开始、停止和继续:
var timer = function() {
var that = {};
var seconds = 0;
var hours = 0;
var minutes = 0;
var myTimer;
that.getTime = function() {
var time = hours + " : " + minutes + " : " + seconds;
return time;
}
that.start = function() {
seconds += 1;
if(seconds >= 60) {
seconds -= 60;
minutes += 1;
}
if(minutes == 60)
hours += 1;
document.getElementById('hours').innerHTML = hours;
document.getElementById('minutes').innerHTML = minutes;
document.getElementById('seconds').innerHTML = seconds;
myTimer = setTimeout(function() {
start();
}, 1000);
};
that.stop = function() {
clearTimeout(myTimer);
}
that.reset = function() {
seconds = 0;
hours = 0;
minutes = 0;
clearTimeout(myTimer);
document.getElementById('hours').innerHTML = hours;
document.getElementById('minutes').innerHTML = minutes;
document.getElementById('seconds').innerHTML = seconds;
}
return that;
};
然后,我开始了:
<body onload="var t = timer();t.start();">
<h1>Digital Clock</h1>
<div id="wrap">
<div>
<ul>
<li id="hours"></li>
<li> : </li>
<li id="minutes"></li>
<li> : </li>
<li id="seconds"></li>
</ul>
</div>
</div>
<br/>
</body>
谁能告诉我我犯了什么错误?
更新:终于找到问题所在了不是外部功能。因此,在语句 start() 中,js 将尝试在全局对象中查找函数。当然,没有这样的功能。在这里,我找到了两个解决方案:
-
使用“那个”
myTimer = setTimeout(function() { 那.start(); }, 1000);
-
保存上下文:
var timerInstance = this;
myTimer = setTimeout(function() { timerInstance.start(); }, 1000);
希望这会对你有所帮助。
【问题讨论】:
-
您应该学习如何使用控制台来查看您的程序产生了哪些错误。您通常可以通过在浏览器(或 Google)中按 F12 来执行此操作。对于one,您应该在
start()和continue()函数中使用this.start(),而不是只是start()。您还应该将setTimeout()的结果分配给myTimer,以使您的stop()函数能够正常工作。 -
@Matt 在这个特定的实例上它是
that.start(),而不是this.start()。这种继承的实现是绝对没有必要的,我不确定他们为什么教这个。 -
@joncys:确实你是对的。不错 ;) (虽然我无法更正我原来的评论,因为它现在在 5 分钟窗口之外:))
-
是的,我已经成功实现了没有这个模板的代码,我只是想了解Functional Inheritance是如何工作的,所以我尝试遵循这个模板。但是这里的确切问题是什么?
标签: javascript html oop