clearTimeout不会清除超时

时间:2018-10-23 19:02:13

标签: javascript

试图清除超时,但它不起作用。 console.logging在初始化和销毁​​后会返回一个数字。

    const timer = setTimeout(() => {});
    console.log('initialised', timer); // initialised 22
    clearTimeout(timer);
    console.log('destroyed', timer); // destroyed 22

我期望第二个日志返回空值。我也没想到计时器是一个简单的数字。我本来希望它是一个对象。 clearTimeout在做什么它应该在这里做什么?

5 个答案:

答案 0 :(得分:2)

timer变量包含一个代表特定计时器的唯一数字。清除计时器将停止异步操作,但是您的变量仍然仅仅是变量,它将保留您提供的最后一个值,除非它超出范围或为它分配其他内容。

最好的证明您的代码可以正常工作的方法是,给计时器回调函数一些行为,然后查看该行为是否正确。使用您的代码,我们将看到计时器回调函数从未真正运行过(没有回调函数的消息写入控制台),因为您在创建它的函数完成之前就将其取消。除该语句外,我们不需要多余的console.log()语句。

const timer = setTimeout(() => { console.log("The timer function has run!" ); });
clearTimeout(timer);

注意::在大多数情况下,我们不需要知道timer变量的实际值。我们只需要存储它就可以在以后终止其相应的计时器操作。

答案 1 :(得分:0)

clearTimeout确实在完成预期的工作。创建超时时,它将返回一个唯一的数字,在这种情况下,您将其保存在“ timer”变量中。现在,当您清除超时时,它将停止setTimeout执行,但不会删除变量“ timer”

答案 2 :(得分:0)

  

我希望第二个日志返回空值。

timer是一个简单的变量,其中包含一个数字(计时器的ID)。进行clearTimeout不会更改其值,但是清除超时,即停止计时器。

  

我希望它是一个对象

为什么?没有什么可存储的。这是一个简单的数字,第一个计时器从1开始,第二个计时器从2开始,依此类推。

答案 3 :(得分:0)

setTimeout定义一个计时器,并返回一个数字,该数字是该计时器的唯一ID。 clearTimeout获取计时器ID并将其取消。

由于JavaScript中的数字值是不可变的,并且您基本上是将timer变量的值发送到clearTimeout函数,因此语言或浏览器无法更改变量的值,因此数字不会改变您的功能范围,结果是您在两个日志中仍然看到相同的数字。

但是,它确实取消了超时,因此只要您在调用setTimeout之前调用了它,就不会调用您发送到clearTimeout的函数。

有关setTimeoutclearTimeout的更多信息。

答案 4 :(得分:0)

让我们了解这些函数的返回值。

  

返回的timeoutID是一个正整数,用于标识   通过调用setTimeout();

创建的计时器      

此值可以传递给clearTimeout()来取消超时。

保证setTimeout()将始终返回ID(数字)而不是对象。

  

clearTimeout()的返回值为undefined

此外,我还要补充一点,在Javascript中,类型number总是按值传递。因此,当您将其传递给函数时,不要期望它会发生变化。就像您的情况一样,

clearTimeout(timer);

这样的调用永远无法更改传递的变量(类型number)的值(在源头)。