0

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つの解決策を見つけました:

  1. 「あれ」を使う

    myTimer = setTimeout(function() { that.start(); }, 1000);

  2. コンテキストを保存します。

    var timerInstance = this;

    myTimer = setTimeout(function() { timerInstance.start(); }, 1000);

これがあなたを助けることを願っています。

4

1 に答える 1

0

変更したコードを含む jsFiddle は次のとおりです: http://jsfiddle.net/6YWLJ/

「that」を「this」に置き換え(「this」はタイマーを表します)、「var timer」の代わりに「window.timer」を使用しました

後で編集: これは修正されたコードのバージョンであるため、タイマーのように機能します (コードにいくつかのバグがありました) http://jsfiddle.net/6YWLJ/2/

于 2012-04-17T10:01:00.970 に答える