【问题标题】:Javascript: settimeout problemJavascript:设置超时问题
【发布时间】:2011-06-23 18:11:40
【问题描述】:

当我开始我的脚本时,我有这个:

var my_great_masterpiece = new function ()
{
        var self = this;

然后在我的脚本中,我有这个:

        response_xml: function ()
        {
            if (self.http_request.readyState == 4)
            {
                if (self.http_request.status == 404 && countXmlUrl <= 3)
                {
                    countXmlUrl++;
                    self.realXmlUrl = xmlUrl[countXmlUrl];
                    self.request_xml();
                }
                if (self.http_request.status == 200)
                {
                    self.xmlDoc = self.http_request.responseXML;
                    self.storage.setItem('domains_raw_xml', self.http_request.responseText);
                    self.main.peter_save_data();
                    self.timervar = setTimeout(function ()
                    {
// ########### Below line gives the error #############################
                        self.new_version_show_window();
                    }, 2000);
                }
            }
        },
        new_version_show_window: function ()
        {
...
}

我得到的错误是:

错误:self.new_version_show_window 是 不是函数

我做错了什么?

谢谢!

【问题讨论】:

  • 您是否尝试将new_version_show_window 的函数定义移到调用它的位置上方?另外,在new_version_show_window之前使用分号而不是逗号
  • 第二部分如何连接到第一部分?你设置prototype了吗?
  • @josh.trow:不,它似乎是一个对象字面量。属性用逗号分隔。
  • @josh.trow - 你误解了代码。我看不到任何语法错误。
  • 您必须提供更多信息。我们必须知道new_version_show_window 的定义位置。现在它可能无处不在......

标签: javascript function settimeout


【解决方案1】:

从您的代码中不清楚new_version_show_window 的定义位置。也许您可以在 self 上明确定义它:

self.new_version_show_window = function () {
    /* ... */
}

相反。或者您可以在本地命名空间中定义它并直接在 setTimeout 调用中使用它:

self.timervar = setTimeout(function () {
    new_version_show_window();
 }, 2000);

或者简单地说:

self.timervar = setTimeout(new_version_show_window, 2000);

因为closure,在外层函数中声明的变量在内层函数中也是可用的。

编辑

感谢您发布整个代码。 new_version_show_window 是在 this.main 上定义的,因此您必须访问它:

self.timervar = setTimeout(function () {
    self.main.new_version_show_window();
 }, 2000);

【讨论】:

  • 如果(部分)对象字面量用作原型,那么它应该可以工作。但我们需要更多信息……
  • 是的,你是对的。然而,由于self 关闭了所有函数,它基本上是一个单例——对于原型来说意义不大。
  • @Ryan:正如我所说,我们实际上需要完整的代码。无法判断您做错了什么,因为我们不知道第二部分的范围。
  • new_version_show_window 是在 this.main 上定义的,所以你必须调用self.main.new_version_show_window();
  • 成功了!多谢你们!不知道 JS 什么时候变得这么复杂了……几年前我曾经使用过一些简单的东西,现在又重新开始了。匿名函数......封装的对象......以前从未做过/曾经做过,我很迷茫。如果不是因为 SO 和你们这些了不起的人,我会大便……谢谢!
【解决方案2】:

self 可能是 JavaScript [1] 中的保留字。这可能会给您带来一些问题,因此请尝试将变量命名为不同的名称。

[1]http://www.quackit.com/javascript/javascript_reserved_words.cfm

【讨论】:

  • @Jivings:好吧,我可以告诉你,在浏览器上下文中使用它没有问题。否则我的很多代码都会被破坏......绝对可以将其定义为函数中的局部变量。没有其他可能与之冲突的预定义变量。
  • @Felix - 哈哈好吧,我想我以前也用过它。我只是没有立即看到代码有任何其他错误。
  • 菲利克斯是对的。它可能在这些列表中,但self 至少作为局部变量不会引起任何问题。我已经使用了很多,没有任何问题。
【解决方案3】:

这是范围问题。 new_version_show_window 仅在调用它的构造范围内(显然是某种 jQuery AJAX 函数)。如果您在它现在存在的有限范围之外定义它,它将仅对my_great_masterpiece 可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多