关于递归地使用递归setTimeOut和在其他地方调用的clearTimeOut,我有一个简短的问题。
在极少数情况下,会不会出现clearTimeOut不会真正停止循环的bug?有没有可能timeOutID get更改为一个新值,并在旧值上调用clearTimeout?
代码如下:
timeOutID = 0;
function timeOutRecusive() {
    timeOutID = setTimeout('timeOutRecusive();', 1000);
}
function killTimeOutRecusive() {
    clearTimeout(timeOutID);
}
//when page started.
start() {
    timeOutRecusive();
}
//When a button is press, calls killTimeOutRecursive();编辑:我的代码中有一些拼写错误。它应该是'timeOutID‘而不是clockID。clearTimeOut应为“clearTimeout”(使用其内置)
发布于 2018-10-31 06:28:46
你的想法是正确的。如果指定超时的回调方法将在并行执行中被调用,那么当您尝试清除当前超时时,它可能只会创建一个新的超时(尚未更新变量)。
但是,超时处理是按顺序执行的。(这就是为什么有时候触发回调需要的时间比1000ms要长得多)
含义:
等待你的代码即将创建一个新的超时,你的-If调用“等待”,然后清除3ms的旧计时器。
-If您即将清除超时,当超过1000ms时,只要您的代码繁忙,回调就不会被触发。当它被清除时,当延迟1004ms后执行超时时,它将不再被添加到事件队列中。
发布于 2018-10-31 06:10:55
不是的。
忽略没有clearTimeOut函数(它是clearTimeout)并且它是使用clockID而不是timeOutID调用的事实,所有这些语句都将按顺序运行;setTimeout和朋友可能运行的任何任务都将仅在当前JavaScript的同步块运行后运行,即序列将类似于
[frame]
  start()
  setTimeout(...)
  clearTimeout(...)
[frame]
  (this is where timeout functions could be run)https://stackoverflow.com/questions/53073548
复制相似问题