Javascript超时问题
我有一个Javascript类:Javascript超时问题,javascript,Javascript,我有一个Javascript类: function PageManager () { this.timeoutHandler = function () { alert ("hello"); } this.startTimeout = function () { this.timeout = setTimeout ("this.timeoutHandler()", 1000); } } 当我调用obj.startTimeout(
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不是问题所在。