時,setTimeout不起作用,我試圖實現這樣的計時器。它有私有變量(秒,小時,分鐘)和三個公共方法:啓動,停止和繼續:在閱讀Douglas Crockford的「JavaScript:The Good Parts」之後,我使用Functional Inheritance
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的(函數(){ that.start();} ,1000);
保存上下文:
變種timerInstance =此; ()函數(){ timerInstance.start(); },1000);
希望這會幫助你。
你應該學習如何使用** **控制檯來看看你的程序產生了什麼錯誤。您通常可以通過在瀏覽器(或Google)中按F12來執行此操作。對於* one *,您應該在'start()'和'continue()'函數中使用'this.start()',而不是*只使用''start()'。您還應該將'setTimeout()'的結果賦值給'myTimer',以使您的'stop()'函數正常工作。 – Matt 2012-04-17 09:55:37
@Matt在這個特定的實例上它是'that.start()',而不是'this.start()'。這種繼承的實現是絕對不必要的,我不確定,他們爲什麼要這樣教。 – joncys 2012-04-17 10:04:22
@joncys:的確你是對的。以及拾取;)(雖然我不能糾正我原來的評論,因爲它現在超出了5分鐘的窗口:)) – Matt 2012-04-17 10:06:03