当前位置: 首页 > 面试题库 >

setTimeout和JavaScript中的“ this”

柴飞扬
2023-03-14
问题内容

我有一个使用该setTimeout函数并调用另一个方法的方法。在初始加载时,方法2可以正常工作。但是,超时后,我得到一个错误,它method2是未定义的。我在这里做错了什么?

例如:

test.prototype.method = function()
{
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method, 5000);
};

test.prototype.method2 = function(name) {
    for (var i = 0; i < document.images.length; i++) {
        if (document.images[i].id.indexOf(name) > 1) {
            return document.images[i];
        }
    }
};

问题答案:

问题是setTimeout()导致javascript使用全局范围。本质上,您是在调用method()类,而不是从中调用this。相反,您只是在告诉setTimeout您使用method没有特定作用域的函数。

要解决此问题,您可以将函数调用包装在另一个引用正确变量的函数调用中。它看起来像这样:

test.protoype.method = function()
{
    var that = this;

    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";

    var callMethod = function()
    {
        that.method();
    }

    timeDelay = window.setTimeout(callMethod, 5000);
};

that可能是this因为callMethod()在方法的范围内。

当您需要将参数传递给setTimeout方法时,此问题会变得更加复杂,因为IE不支持向传递两个以上的参数setTimeout。在这种情况下,您需要阅读闭包。

另外,作为旁注,由于method()总是调用,因此您将自己设置为无限循环method()



 类似资料:
  • 问题内容: 专家。JavaScript无法产生所需的延迟效果。 从其他问题上,我因此知道,问题在于settimeout及其使用方式。但是我仍然无法理解Settimeout的工作原理。所以我将代码放在这里。由于知识目的,仅需使用Javascript。 实际上,我正在尝试清除有关 此的 概念,即javascript中的 闭包 。它们是Java的扭曲事物吗? 问题答案: 您有两个问题: 调用回调时将具有

  • 本文向大家介绍浅谈JavaScript中setInterval和setTimeout的使用问题,包括了浅谈JavaScript中setInterval和setTimeout的使用问题的使用技巧和注意事项,需要的朋友参考一下 说到setInterval,就不得不提到setTimeout,二者都是用于定时执行某函数,区别在于setTimeout 只执行一次,而setInterval可以一直连续不断执行

  • 本文向大家介绍JavaScript中setTimeout的那些事儿,包括了JavaScript中setTimeout的那些事儿的使用技巧和注意事项,需要的朋友参考一下 一、setTimeout那些事儿之单线程  一直以来,大家都在说Javascript是单线程,浏览器无论在什么时候,都且只有一个线程在运行JavaScript程序。  但是,不知道大家有疑问没——就是我们在编程过程中的setTime

  • 问题内容: 据我所知,这两段JavaScript的行为方式相同: 选项A: 选项B: 使用setTimeout和setInterval之间有什么区别? 问题答案: 他们本质上试图做同样的事情,但是这种方法比该方法更加准确,因为要等待1000ms,然后运行该函数,然后设置另一个超时。因此,等待时间实际上超过了1000毫秒(如果函数执行时间较长,则等待时间会更长)。 尽管有人可能会认为将执行完全相同每

  • 本文向大家介绍JavaScript中setTimeout和setInterval函数的传参及调用,包括了JavaScript中setTimeout和setInterval函数的传参及调用的使用技巧和注意事项,需要的朋友参考一下 如何向 setTimeout 、 setInterval 传递参数 看如下代码: 这样写是可以正常工作的,但是如其说这是参数传递,还不如说是直接使用的全局变量。所以,这种写

  • 本文向大家介绍javascript中setTimeout使用指南,包括了javascript中setTimeout使用指南的使用技巧和注意事项,需要的朋友参考一下 javascript中setTimeout使用指南 以上所述就是本文的全部内容了,希望大家能够喜欢。