setTimeout 返回什么?

IT技术 javascript
2021-02-27 01:42:09

我很好奇 setTimeout 返回什么。所以我做了一个快速测试:

var thing = setTimeout(function(){},1);

令我惊讶的是,它给了我一个数字。1351每一次都不一样。

那么它返回的真的只是一个数字吗?所以我真的可以这样做吗?

clearTimeout(1351);

很混乱...

5个回答

它是一个句柄(唯一标识符)。当您创建超时时,JavaScript 运行时将一个句柄与您创建的超时相关联,并且它可以通过句柄setTimeout()返回来识别该超时当您运行时clearTimeout(),它会通过查看您传入的唯一句柄来知道您在谈论什么超时。

它可以是一个Object,我用node.js以下方法测试过

var sto = setTimeout(
    function(){console.log('ping');}, 
    1000
);

console.log(sto);

输出是:

{ _idleTimeout: 1000,
  _idlePrev:
   { '0': [Function: listOnTimeout],
     _idleNext: [Circular],
     _idlePrev: [Circular],
     msecs: 1000 },
  _idleNext:
   { '0': [Function: listOnTimeout],
     _idleNext: [Circular],
     _idlePrev: [Circular],
     msecs: 1000 },
  _idleStart: 2413359232,
  _onTimeout: [Function],
  _repeat: false,
  domain:
   { domain: null,
     _events: { error: [Function] },
     _maxListeners: undefined,
     members: [] } }
正如@Andrew_1510 所说,在 Nodejs 中它返回一个 Timeout 对象而不是一个 ID。了解这一点很有用,因为大多数实现都setTimeout返回一个 ID 而不是像 Nodejs 这样的 Timeout 对象,这可能会让一些人措手不及。在撰写本文时,根据 MDN 文档,NodeJS 似乎是唯一一个返回对象而不是 ID 的对象:developer.mozilla.org/en-US/docs/Web/API/...
2021-05-11 01:42:09

您可以将其视为一个timerID,它唯一标识一个计时器,以便您可以通过clearTimeout(timerID)

它是一个任务 ID(我更愿意认为它是一个 task_ID 而不是一个让每个人都感到困惑的 Timeout_ID)。

想象一下,您必须启动一个默认功能:“f_cup_of_tea”,任何普通人在您的网站上停留 5 分钟后最终都会需要该功能。

tea_Task_ID = window.setTimeout(f_cup_of_tea, (5*60*1000), 15, 2);

像:函数 f_cup_of_tea(milk_ml, Sugar) { .... }

但不幸的是,迟到了十秒,一个迷幻的用户更喜欢得到一些与整个世界不同的东西,并选择了坏龙舌兰酒……

你必须在五分钟内取消预定的美味“f_cup_of_tea”......幸运的是javascript已经想到了这种问题,你可以使用:

window.clearTimeout(tea_Task_ID);

(但仅当“ f_cup_of_tea ”尚未启动时才有效)。

接下来,您可以启动:

tequila_Task_ID = window.setTimeout(f_bad_tequila, (5*1000), 0);  // for in 5s, with zero ice...

实际上,您应该非常小心地清除超时帽子方式,因为在某些情况下该数字可能会发生变化。例如,如果您在代码中的某处添加另一个超时(意外地在此之前(1351),此 ID 可能会更改为 1352。因此您的 clear Timeout 将清除不同的超时。最好的方法是使用变量;

let test = "set_Timeout(() => {
    alert("hi")
}, 3000);

clear_Timeout(test);