首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript深度思考:在按钮上按下clearTimeout调用的递归setTimeOut函数?

Javascript深度思考:在按钮上按下clearTimeout调用的递归setTimeOut函数?
EN

Stack Overflow用户
提问于 2018-10-31 06:05:49
回答 2查看 173关注 0票数 0

关于递归地使用递归setTimeOut和在其他地方调用的clearTimeOut,我有一个简短的问题。

在极少数情况下,会不会出现clearTimeOut不会真正停止循环的bug?有没有可能timeOutID get更改为一个新值,并在旧值上调用clearTimeout

代码如下:

代码语言:javascript
运行
复制
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”(使用其内置)

EN

回答 2

Stack Overflow用户

发布于 2018-10-31 06:28:46

你的想法是正确的。如果指定超时的回调方法将在并行执行中被调用,那么当您尝试清除当前超时时,它可能只会创建一个新的超时(尚未更新变量)。

但是,超时处理是按顺序执行的。(这就是为什么有时候触发回调需要的时间比1000ms要长得多)

含义:

等待你的代码即将创建一个新的超时,你的-If调用“等待”,然后清除3ms的旧计时器。

-If您即将清除超时,当超过1000ms时,只要您的代码繁忙,回调就不会被触发。当它被清除时,当延迟1004ms后执行超时时,它将不再被添加到事件队列中。

票数 0
EN

Stack Overflow用户

发布于 2018-10-31 06:10:55

不是的。

忽略没有clearTimeOut函数(它是clearTimeout)并且它是使用clockID而不是timeOutID调用的事实,所有这些语句都将按顺序运行;setTimeout和朋友可能运行的任何任务都将仅在当前JavaScript的同步块运行后运行,即序列将类似于

代码语言:javascript
运行
复制
[frame]
  start()
  setTimeout(...)
  clearTimeout(...)
[frame]
  (this is where timeout functions could be run)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53073548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档