Javascript超时问题

Javascript超时问题,javascript,Javascript,我有一个Javascript类: function PageManager () { this.timeoutHandler = function () { alert ("hello"); } this.startTimeout = function () { this.timeout = setTimeout ("this.timeoutHandler()", 1000); } } 当我调用obj.startTimeout(

我有一个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
,则代码将在全局范围内计算。始终传递一个功能参考

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后,您会看到
窗口
,当然它没有
超时处理程序
方法

这就是为什么您永远不应该传递
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();

当您执行此代码时,您将拥有正在扩展的范围。

问题是您正在传递
setTimeout
字符串。此字符串为
eval
'd,具有窗口范围。因此,如果你要这样做:

    this.timeout = setTimeout ("console.log(this);", 1000);
。。。安装Firebug后,您会看到
窗口
,当然它没有
超时处理程序
方法

这就是为什么您永远不应该传递
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();

当您执行此代码时,您将拥有您正在体验的范围。

重复<代码>obj
不是问题。重复<代码>obj不是问题所在。