使用setInterval与setTimeout的randomSelect函数代码流程解析及疑问
随机按钮闪烁选中代码解析
核心功能
这段代码实现的是:让按钮随机闪烁(高亮→取消高亮)30次后,最终固定高亮一个随机选中的按钮。
逐行执行流程
- 定义
times = 30,指定要执行的闪烁次数。 - 创建
interval定时器,每隔100ms触发一次回调:- 调用
pickRandomTag()随机选中一个按钮 - 调用
highlightTag()给该按钮添加高亮状态 - 启动一个100ms的延迟定时器,到期后调用
unHighlightTag()取消该按钮的高亮
- 调用
- 创建外层延迟定时器,延迟
30*100=3000ms后执行:- 调用
clearInterval(interval)停止闪烁循环 - 再启动一个100ms的延迟,之后随机选一个按钮并调用
highlightTag()让它保持高亮状态
- 调用
修改外层setTimeout延迟的影响解析
你提到修改外层setTimeout的times*100参数会改变首次高亮与取消高亮的间隔,本质是JS异步事件队列的特性导致的:
- JS的定时器不会阻塞代码,只会把回调加入事件队列等待主线程空闲时执行。
- 外层
setTimeout的延迟直接决定了clearInterval的执行时机:- 如果延迟小于100ms:
clearInterval会在首次interval回调触发前执行,直接终止闪烁循环,首次高亮根本不会触发。 - 如果延迟在100ms~200ms之间:首次
interval回调会正常触发(100ms时高亮按钮),但clearInterval会在取消高亮的定时器触发前执行——不过取消高亮的定时器已经被创建,所以取消操作仍会在200ms执行,理论间隔还是100ms,但如果事件队列堆积了其他任务,可能会出现视觉上的延迟偏差。 - 如果延迟大于200ms:闪烁循环会执行更多次,但首次高亮的取消间隔依然是100ms,你感受到的变化其实是后续闪烁次数或最终高亮时机的改变,而非首次间隔。
- 如果延迟小于100ms:
内容的提问来源于stack exchange,提问作者jash
相关产品推荐
相关产品推荐

