Javascript超时问题

Javascript Timeout Issue

本文关键字:问题 超时 Javascript      更新时间:2023-09-26

我有这个Javascript类:

function PageManager () {
    this.timeoutHandler = function () {
        alert ("hello");
    }
    this.startTimeout = function () {
        this.timeout = setTimeout ("this.timeoutHandler()", 1000);
    }
}

当我调用obj.startTimeout ();时,我得到了这个错误:

this.timeoutHandler is not a function

如何在超时时调用类函数?

如果将字符串传递给setTimeout,则代码将在全局范围内求值。始终传递函数引用:

this.startTimeout = function () {
    var self = this;
    this.timeout = setTimeout(function() {
       self.timeoutHandler();
    }, 1000);
}

或者,如果你不需要引用timeoutHandler中的对象,那么你可以直接传递函数:

this.timeout = setTimeout(this.timeoutHandler, 1000);

问题是您正在向setTimeout传递一个字符串。此字符串为eval'd,具有窗口的作用域。所以,如果你要这样做:

    this.timeout = setTimeout ("console.log(this);", 1000);

安装Firebug后,您会看到this就是window,当然它没有timeoutHandler方法。

这就是为什么永远不应该向setTimeout传递字符串的原因。给它一个函数引用。

function PageManager () {
    this.timeoutHandler = function () {
        alert ("hello");
         console.log(this);
    }
    this.startTimeout = function () {
        this.timeout = setTimeout (this.timeoutHandler, 1000);
    }
}
obj = new PageManager ();
obj.startTimeout();

当您执行此代码时,您将拥有所期望的范围。