【问题标题】:setTimeout doesn't work when using Functional Inheritance使用功能继承时 setTimeout 不起作用
【发布时间】: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 将尝试在全局对象中查找函数。当然,没有这样的功能。在这里,我找到了两个解决方案:

  1. 使用“那个”

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

  2. 保存上下文:

    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


【解决方案1】:

这是一个包含您修改后的代码的 jsFiddle:http://jsfiddle.net/6YWLJ/

我用“this”替换了“that”(“this”代表你的计时器),而不是“var timer”,我使用了“window.timer”

稍后编辑:这是一个更正代码的版本,所以它就像一个计时器(你的代码中有一些错误)http://jsfiddle.net/6YWLJ/2/

【讨论】:

  • 谢谢,但是您知道为什么它不能与“that”一起使用吗?也许我使用这个模板的方式对你来说看起来很陌生,但当我读那本书时,我只想尽可能多地了解:)
  • 我不确定。这可能不是因为“那个”,而是因为“var timer”而不是“window.timer”。这是使用“that”更新的工作 jsFiddle:jsfiddle.net/6YWLJ/5
  • 谢谢!!我发现了错误,这是 Crockford 在他的书中所说的“当使用此模式(方法调用模式)调用函数时, this 绑定到全局对象。这是语言设计中的错误。有语言如果设计正确, 当调用内部函数时, this 仍然会绑定到外部函数的 this 变量. 这个错误的结果是一个方法不能使用内部函数来帮助它完成它的工作, 因为内部函数确实不共享方法对对象的访问,因为它的 this 绑定到错误的值..."
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2015-03-04
  • 2012-06-04
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多