1
function Timer() {
 this.initialTime = 0;
 this.timeStart = null;

 this.getTotalTime = function() {
  timeEnd = new Date();
  diff = timeEnd.getTime() - this.timeStart.getTime();

  return diff+this.initialTime;
 };

 this.formatTime = function() {
  interval = new Date(this.getTotalTime());

  return  interval.getHours() + ":" +  interval.getMinutes() + ":" + interval.getSeconds();
 };

 this.start = function() {
  this.timeStart = new Date();

  setTimeout("this.updateTime()", 1000);
 };

 this.updateTime = function() {
  alert(this.formatTime());
  setTimeout("this.updateTime()", 1000);
 };
}


timer = new Timer();
timer.start();

我收到一个错误:

this.updateTime 不是函数

有任何想法吗?

谢谢

4

4 回答 4

2

您的字符串不会在对象的上下文中进行评估,因此this不会引用您认为的内容。

您不应该将字符串参数传递给setTimeout. 相反,您应该传递一个匿名函数,该函数使用已保存的this.

例如:

var self = this;
setTimeout(function() { self.updateTime(); }, 1000);

self变量是必需的,因为setTimeout' 的回调也不会在对象的上下文中进行评估。

于 2010-04-09T01:47:55.333 回答
1

有没有更优雅的方式?

是的,在 ECMAScript 第五版中:

setTimeout(this.updateTime.bind(this), 1000);

但是,在所有浏览器都支持第五版之前(它们还没有长期支持),您应该添加自己的 Function.bind 实现作为后备。例如。:

// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        if (arguments.length<=1) {
            return function() {
                return that.apply(owner, arguments);
            };
        } else {
            var args= Array.prototype.slice.call(arguments, 1);
            return function() {
                return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
            };
        }
    };
}

您可能还喜欢使用setInterval来避免重复setTimeout调用。最后,您应该记住将所有变量( 、 等)声明timeEnddiffvar否则您会得到意外的全局变量,这可能会导致您在调试时心痛。

于 2010-04-09T10:01:02.393 回答
1

尝试

var me = this;
setTimeout(function() { me.updateTime() }, 1000);
于 2010-04-09T01:47:21.233 回答
0

如果您向 提供一个字符串setTimeout,该字符串将按字面意思执行。问题是,它将在稍后的某个时间在全局上下文中执行,在您的Timer对象之外,因此this意味着完全不同的东西。

只需像这样传递函数本身:

function Timer() {
  var self = this;   // make reference to this that won't change with context

  this.updateTime = function() {
    alert(self.formatTime());
    setTimeout(self.updateTime, 1000);
  };

}
于 2010-04-09T01:48:37.880 回答