【问题标题】:Javascript Timeout IssueJavascript超时问题
【发布时间】:2011-06-09 13:42:34
【问题描述】:

我有这个 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

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

【问题讨论】:

标签: javascript


【解决方案1】:

如果您将字符串传递给setTimeout,代码将在全局范围 中进行评估。始终传递函数引用

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

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

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

【讨论】:

    【解决方案2】:

    问题是你传递setTimeout 一个字符串。这个字符串是eval'd,带有窗口的范围。因此,如果您要这样做:

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

    ...安装 Firebug 后,您会看到 thiswindow,当然它没有 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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-31
      • 2021-03-18
      • 1970-01-01
      • 2011-04-24
      • 2011-06-19
      • 1970-01-01
      • 2011-04-03
      • 2011-12-28
      相关资源
      最近更新 更多