setTimeout与0ms之后是否需要clearTimeout?

not*_*ng9 7 javascript settimeout

正如我已经了解的那样(这里:https://www.youtube.com/watch?v = 8aGhZQkoFbQ),在某些情况下,调用setTimeout时延迟0ms(因为事件循环)会很有用.

现在,每当我使用时,setTimeout我也会小心地clearTimeout在适当的位置打电话,以确保没有任何东西留在某处,并在我不希望它被执行的地方执行.

所以我的问题是:clearTimeoutsetTimeout0ms 之后打电话是否有必要(有意义吗?)传递的函数会立即附加到回调队列中,因此我认为clearTimeout不会(也不能)执行任何操作.或者clearTimeout甚至可以从回调队列中删除传递的函数(因此在超时到期之后但在函数执行之前)?

第二个问题:即使它没有做任何事情,clearTimeout在这些情况下总是要求"最佳做法" 吗?

use*_*740 12

在具有0ms的setTimeout之后调用clearTimeout是否有必要(是否有意义)?

如果目标是阻止异步计时器回调运行,则是必要的.可以根据何时调用回调来完全讨论执行顺序.

首先,作为延迟的0毫秒值意味着"尽快运行回调"(来自未来的异步上下文),但是:

  1. 它并没有改变如何setTimeout的作品 ; 和

  2. 0 不是实际使用的值.

传递的函数会立即附加到回调队列中,因此我认为clearTimeout不会(也不能)执行任何操作.

这是不正确的.传递的函数不会 "立即附加到回调队列".相反,超时到期计时器仍处于活动状态时,将调用回调函数.可能有其他异步回调 - 来自定时器或其他 - 可以在之前运行.

此外,保证所有剩余的同步代码在定时器回调发生之前运行:在此上下文中清除超时可防止定时器回调被调用,无论同步代码中花费的时间如何.

即使它没有做任何事情,无论如何,总是在这些情况下调用clearTimeout是"最佳做法"吗?

调用clearTimeout也可以

  1. 如果在回调之前清除(因为它移除了定时器),则阻止回调执行;或者;

  2. 如果回调已经发生,则不执行任何操作(因为计时器不再处于活动状态)

因此,为了正确运行代码/算法,需要清除定时器; 或者这是一个无用的操作.创建一个计时器只是为了立即取消它可能毫无意义,但这是一个关于代码结构的题外话.

我还要注意在适当的位置调用clearTimeout以确保没有任何东西留在某处并在我不希望它被执行的位置执行.

如上所述,不需要手动清除不再活动的计时器; 并且在调用定时器回调之前取消定时器将移除定时器,从而防止定时器回调执行.

何时/何时/如果取消定时器取决于整个设计.


取消执行代码中的超时可防止回调运行:"A"或"B"回调都不会运行.

a = setTimeout(function () { console.log("A"); }, 0);
clearTimeout(a);

b = setTimeout(function () { console.log("B"); }, 0);
s = Date.now()
while (Date.now() - s < 100) { /* waste 100ms of CPU */ }
clearTimeout(b);
Run Code Online (Sandbox Code Playgroud)

在首先运行的异步事件中取消超时会阻止回调运行:"B"回调永远不会运行:

a = setTimeout(function () { console.log("A"); clearTimeout(b); }, 0);
b = setTimeout(function () { console.log("B"); }, 0);
Run Code Online (Sandbox Code Playgroud)

虽然使用了辅助计时器(因为订购得到很好的保证),但在"0ms"超时之前,也有可能发生其他异步事件(按钮点击,Web工作者,AJAX等).

回调后(来自任何上下文)调用的clearTimeout无用:

a = setTimeout(function () { console.log("A"); clearTimeout(a); }, 0);

a = setTimeout(function () { console.log("A"); }, 0);
b = setTimeout(function () { console.log("B"); clearTimeout(a); }, 0);
Run Code Online (Sandbox Code Playgroud)

  • 完善!这就是我一直在寻找的答案.感谢所有描述所有不同案例的努力.非常感谢! (2认同)

Lee*_*Lee 5

clearTimeout将删除该功能。在 Chrome 控制台中试试这个:

var timer = setTimeout(function() { console.log('hello'); }, 0);
clearTimeout(timer);
Run Code Online (Sandbox Code Playgroud)