Douglas Crockford の「JavaScript: The Good Parts」を読んだ後、このようなタイマーを実装しようとしました。プライベート変数 (秒、時間、分) と 3 つのパブリック メソッド (開始、停止、続行) があります。
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>
誰が私が作ったエラーを教えてもらえますか?
更新: 最後に、問題が見つかりました。別の関数 (内部関数など) 内から関数を使用する場合、「this」は外部関数ではなくglobalにバインドされます。したがって、ステートメント start() では、js はグローバル オブジェクト内の関数を見つけようとします。もちろん、このような機能はありません。ここで、2つの解決策を見つけました:
「あれ」を使う
myTimer = setTimeout(function() { that.start(); }, 1000);
コンテキストを保存します。
var timerInstance = this;
myTimer = setTimeout(function() { timerInstance.start(); }, 1000);
これがあなたを助けることを願っています。