当前位置: 首页 > news >正文

Web前端入门第 87 问:JavaScript 中 setInterval 和 setTimeout 细节

setIntervalsetTimeout 两者都是用于控制 JS 函数延迟执行,但是在执行机制和用途上还是有点儿差异。

虽然说两者功能上有区别,但在使用上却可以相互模拟各自的功能,大胆的猜测下:也许浏览器内核底层都是同一个方法,只是上层封装出的两个语法糖而已。

语法

两者在语法上极其相似,除了方法名不一样,其他地方没有任何区别:

// 启动定时器
const intervalID = setInterval(func, delay, [arg1], [arg2], ...);
const timeoutID = setTimeout(func, delay, [arg1], [arg2], ...);// 停止定时器
clearInterval(intervalID);
clearTimeout(timeoutID);

执行次数区别

  • setInterval 用于控制函数在指定时间间隔重复执行,直到程序代码手动清除定时任务或浏览器进程退出。
<div id="output"></div><script>(() => {const output = document.getElementById('output')function handle (...args) {output.innerHTML += args.join('、') + '<br>'}// 传入参数 '前端路引'setInterval(handle, 1500, '公众号', '前端路引');})();
</script>

效果:

1

  • setTimeout 用于控制函数在延迟时间后执行一次,然后自动停止。可以通过递归调用模拟 setInterval
<div id="output"></div><script>(() => {const output = document.getElementById('output')function handle (...args) {output.innerHTML += args.join('、') + '<br>'/*默认情况只执行一次,可通过递归调用模拟 setInterval*/setTimeout(handle, 1500, ...args);}// 传入参数 '前端路引'setTimeout(handle, 1500, '公众号', '前端路引');})();
</script>

效果:

2

取消定时器区别

从语法上就能看出来,取消定时器的时需要使用对应的取消方法,不能混用:

  • clearInterval
<button>取消定时器</button>
<div id="output"></div><script>(() => {const output = document.getElementById('output')function handle (...args) {output.innerHTML += args.join('、') + '<br>'}// 传入参数 '前端路引'const intervalID = setInterval(handle, 1500, '公众号', '前端路引');document.querySelector('button').addEventListener('click', () => {clearInterval(intervalID)})})();
</script>

效果:

3

  • clearTimeout
<button>取消定时器</button>
<div id="output"></div><script>(() => {const output = document.getElementById('output')function handle (...args) {output.innerHTML += args.join('、') + '<br>'// 递归调用模拟 setIntervaltimeoutID = setTimeout(handle, 1500, ...args);}// 传入参数 '前端路引'let timeoutID = setTimeout(handle, 1500, '公众号', '前端路引');document.querySelector('button').addEventListener('click', () => {clearTimeout(timeoutID)})})();
</script>

效果:

4

可靠性

重点!

记得最开始学习 JS 的时候就有看到说明,setInterval 的定时器是不管任务执行耗时,反正每次到了时间就要执行,不论是否有耗时任务正在执行。而 setTimeout 启动的定时器,会在等到耗时任务执行之后才会启动下一次任务。

所以,如果 setInterval 设定间隔 100ms,但回调需 200ms 执行,就会造成任务堆积,从而引发性能问题,解决办法就是使用递归 setTimeout 来替代。

语言有些空洞,看例子:

<button>取消 interval 定时器</button>
<div id="output"></div><script>(() => {const output = document.getElementById('output')let times = 0function sleep (ms) {return new Promise(resolve => setTimeout(resolve, ms))}async function handle () {await sleep(1000)output.innerHTML = ++times}const intervalID = setInterval(handle, 200);document.querySelector('button').addEventListener('click', () => {clearInterval(intervalID)})})();
</script>

以上代码由于 handle 任务耗时过长, setInterval 定时器并不会等待任务执行完毕,而是直接执行下一次任务,这就会有一个问题,如果清除定时器,任务不会立即停止,还是有部分执行中的任务正在运行。效果:

5

setTimeout 在处理这种情况时,也会存在问题,虽然每次任务会进行排队,但在点击停止按钮时,由于有异步耗时任务正在执行,清除定时器时,没办法立即终止任务,可以尝试下以下代码:

<button>取消 timeout 定时器</button>
<div id="output"></div><script>(() => {const output = document.getElementById('output')let times = 0function sleep (ms) {return new Promise(resolve => setTimeout(resolve, ms))}async function handle () {await sleep(1000)output.innerHTML = ++times// 递归调用模拟 setIntervaltimeoutID = setTimeout(handle, 200);}let timeoutID =setTimeout(handle, 200);document.querySelector('button').addEventListener('click', () => {// 由于存在异步耗时任务,清除定时器可能会无效clearTimeout(timeoutID)})})();
</script>

效果:

6

使用 AbortController 停止定时器:

<button>取消 timeout 定时器</button>
<div id="output"></div><script>(() => {const output = document.getElementById('output')let times = 0function sleep (ms, signal) {return new Promise(resolve => {setTimeout(() => {if (signal.aborted) {return Promise.reject(new DOMException('操作已被取消', 'AbortError'));}resolve()}, ms)})}async function handle (signal) {await sleep(1000, signal)output.innerHTML = ++times// 递归调用模拟 setIntervaltimeoutID = setTimeout(handle, 200, controller.signal);}const controller = new AbortController();let timeoutID =setTimeout(handle, 200, controller.signal);document.querySelector('button').addEventListener('click', () => {controller.abort();})})();
</script>

上面代码中运用了 AbortController 这个控制器终止定时任务,在任务终止后,直接抛出异常,停止定时器。效果:

7

写在最后

定时器是个好东西,但细节也很多,稍不注意就会出现流程错误,所以在使用时还是需要仔细斟酌~~

setInterval 和 setTimeout 没有绝对的应用场景,两者在使用上都可以互相模拟,只是编写代码量的多少而已。

相关文章:

Web前端入门第 87 问:JavaScript 中 setInterval 和 setTimeout 细节

setInterval 和 setTimeout 两者都是用于控制 JS 函数延迟执行,但是在执行机制和用途上还是有点儿差异。 虽然说两者功能上有区别,但在使用上却可以相互模拟各自的功能,大胆的猜测下:也许浏览器内核底层都是同一个方法,只是上层封装出的两个语法糖而已。 语法 两者在语法上…...

基于Python+Vue开发的农产品商城管理系统源码+运行

项目简介该项目是基于Python+Vue开发的农产品商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的农产品商城管理系统项目,大学生可以在实践中学…...

多人多次并发

在测试行业一年多,接触到多人多次并发首先创建线程组在JMeter中添加线程组,设置线程数、Ramp-Up时间和循环次数,然后添加HTTP请求:配置目标服务器的IP、端口和路径,模拟用户的具体操作。通过CSV Data Set Config加载用户数据,实现动态参数化。 查看结果树收集测试数据。合…...

B. Alternating Current

https://codeforces.com/problemset/problem/343/B 题意:给定两根线,告诉你每个节点的两根线的上下位置,问两根线能否无损解开 思路:如果连续的一段一个都在另一个上面或者下面,那么这一段就可以回到他本身的位置。根据这个思路,可以将问题转化为消消乐问题,只要有连续的…...

虚拟电厂运行机制

虚拟电厂(VPP)对电力资源的调节是其最核心、最精妙的功能。它本质上扮演着一个“全能电力调度员”的角色,但其调度对象不再是几个大电厂,而是成千上万个分散的、类型各异的分布式资源。 1. 察:全面感知与实时监测 这是调节的基础。虚拟电厂通过安装在各类终端资源上的智能…...

创建我第一个带记忆能力的langchain机器人

以下内容由AI对话生成带记忆的聊天机器人实现 下面是完整的代码实现,包含详细注释: # chatbot_with_memory.py import os from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain …...

Reinforcing Image Generation with Collaborative Semantic-level and Token-level CoT - jack

https://arxiv.org/pdf/2505.00703 https://github.com/CaraJ7/T2I-R1...

GitHub超 30000+ star , 超强大的开源项目Supervision

Roboflow 的 Supervision 项目已于近期突破 30,000 个 GitHub Stars,是视觉工程师常用的辅助库,让你告别重复造轮子。 Supervision 是 Roboflow 出品、基于 MIT 协议的开源库,用于解决视觉项目中常见的可视化、跟踪、计数、格式转换等需求。可与 YOLO、Detectron2、Transfor…...

深入解析:【JavaEE】网络原理初识

深入解析:【JavaEE】网络原理初识pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

Office文档投毒技术:SHVE中的会话劫持视觉利用新突破

本文深入解析SHVE工具如何通过Office文档投毒技术,利用XSS漏洞和用户对可信网站的信任,在文档下载过程中自动注入恶意宏,实现隐蔽的攻击载荷交付,揭示了现代网络攻击中技术利用与心理信任结合的新型威胁模式。Office文档投毒在SHVE中的应用 大家好!我们带来了会话劫持视觉…...

爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】

案例地址链接:https://gdtv.cn/channels/2 案例爬取链接:https://gdtv-api.gdtv.cn/api/channel/v1/news?beginScore=0&channelId=246&pageSize=11 一、入口定位 首先当我们拿到网站,并且找到我们需要爬取的目标url以后,我们首先复制url到【https://curlconverter…...

简洁美观!一款值得 Star 的 Java 博客项目!

OneBlog —— 一个简洁美观、功能强大并且自适应的 Java 博客。基于 SpringBoot + Bootstrap 开发,支持移动端自适应,配有完备的前台和后台管理功能。大家好,我是 Java陈序员。 今天,给大家介绍一个简洁美观的开源 Java 博客系统。关注微信公众号:【Java陈序员】,获取开源…...

数据结构与算法-33.图-加权有向图最短路径

一、加权有向图 1、加权有向图 边的表示 代码实现 2、加权有向图的实现 二、最短路径 1、定义及性质 2、API设计 3、松弛技术4、Dijkstra算法实现 测试以上仅供参考,如有疑问,留言联系...

白子的情人节礼物

新题崭新出炉题面背景 我永远喜欢砂狼白子! ----MyShiroko 白子最近有点烦恼,因为她敏锐的嗅觉闻到了星野前辈身上有老师的味道。(详见《一日一星野》) 在多次询问星野无果的情况下,她打算直接去夏莱找老师问个清楚。 不过最近情人节快到了,白子决定拿着一些礼物,所以她…...

白子的情人节礼物 题解

咕咕点击查看代码 #include<bits/stdc++.h> #define int long long #define Blue_Archive return 0 #define con putchar( ) #define ent putchar(\n) using namespace std; constexpr int N = 5e5 + 7; constexpr int M = 8e5 + 7; constexpr int INF = 1e18;int n; in…...

Ubuntu上进行Zookeeper集群部署

Ubuntu系统上Zookeeper集群部署安装目录1.zookeeper下载2.zookeeper安装与使用3.zookeeper启动4.zookeeper是什么?为什么要用它?为什么不用Hbase自带的? 1.zookeeper下载 版本无特别要求,一般最新稳定版即可。 这里给出3.8.4的下载链接。(点击即可直接下载) zookeeper官网…...

The Landscape of Agentic Reinforcement Learning综述 - jack

The Landscape of Agentic Reinforcement__Learning for LLMs.pdf https://medium.com/data-science-in-your-pocket/the-landscape-of-agentic-reinforcement-learning-for-llms-a-survey-ed96182d3ed1...

A Survey of Reinforcement Learning for Large Reasoning Models - jack

https://arxiv.org/abs/2509.08827 https://huggingface.co/papers/2509.08827...

r-nacos支持mcp,内置mcp server支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。

r-nacos支持mcp,内置mcp server与接口转发;支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。r-nacos支持mcp,内置mcp server与接口转发;支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。 适用场景 如果你有一个…...

MacOS下微信小程序抓包教程

前言 换mac了,折腾一天抓包,终于成功抓上了。 BurpSuite下载: https://www.52pojie.cn/thread-2005151-1-1.html proifier下载:https://www.proxifier.com/ proifier注册机:https://github.com/y9nhjy/Proxifier-Keygen 一、安装proifier 先正常安装proifier本体,打开注册…...

nvm – nodejs版本管理工具

下载 Releases coreybutler/nvm-windows nvm-setup.exe nvm list available #查看可安装版本 如果报错Could not retrieve https://nodejs.org/dist/index.json: Get "https://nodejs.org/dist/index.json": dial tcp xxx.2x.xx.xxx:xxx: i/o timeoutnvm proxy http…...

财务系统里面,怎么合并使用两个经费本号

财务系统里面,怎么合并使用两个经费本号 把一个经费本号填好之后,正常填写,到提交的那个界面,不要提交。 一直点击 上一步, 到可以填写经费本号的那个界面。再填写第二个经费本号。点击下一步,再填写。最后提交即可。...

【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现) - 详解

【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…...

新范式-LLaDA-VLA 基于扩散模型 VLA模型 - jack

https://mp.weixin.qq.com/s/fwOGuKy2Wtz_xXx3nCT28w 论文题目:LLaDA-VLA: Vision Language Diffusion Action Models 论文链接:https://arxiv.org/abs/2509.06932 项目主页:https://wenyuqing.github.io/llada-vla/ 论文时间:Sep, 8, 2025 作者单位:中科大,南京大学,原…...

Redis是如何进行内存管理的?缓存中有哪些常见问题?如何实现分布式锁?

Redis内存管理 Redis的内存用完了会怎样? 如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回)。 也可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。 Redis如何做内存优化? 可以好好利用Hash,list,sorted set,set等集合类型数据,…...

5 遥感与机器学习第三方库安装 - 详解

5 遥感与机器学习第三方库安装 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…...

移远OPENCPU笔记

OPENCPU 支持的操作系统:Linux、ThreadX 芯片平台:国产ASRqq:505645074...

2025.9.16——1绿

普及+/提高 P3155 [CQOI2009] 叶子的染色 昨天用贪心写只拿了部分分,wpmx告诉我要用DP,但当时因为要赶作业没时间写。 今天补上了。...

Unity游戏开发:互动小游戏的技术实现与运营盈利之道

在数字化娱乐飞速发展的当下,互动小游戏凭借其独特的趣味性与强交互性,深受广大用户喜爱。从热闹非凡的线下活动,到流量庞大的线上平台,互动小游戏都展现出了强大的影响力与商业价值。在众多游戏开发引擎中,Unity以其卓越的性能和广泛的适用性,成为了互动小游戏开发的首选…...

如何实现主线程捕获子线程异常

一、基础概念...

LGP5688 [CSP-S-JX 2019] 散步 学习笔记

LGP5688 [CSP-S-JX 2019] 散步 学习笔记 Luogu Link 前言 一题多解这一块。 题意简述 \(n\) 个人在公园内散步。公园可以看作一个环形,上有 \(m\) 个出口,按逆时针顺序记作 \(1\) 号口到 \(m\) 号口。 环总长 \(V\) 米。记 \(a_i\) 为 \(i\) 号出口从 \(1\) 号口按逆时针走到…...

少儿练字控笔字帖

握笔和控笔是写好字的基础 准备了一些基本的控笔练习字帖少儿练字控笔字帖下载...

架构师必备:缓存更新模式总结

大家好,我是Java烘焙师。如何更新缓存和DB、做到性能和一致性的取舍,是一个很常见的话题。下面结合笔者的经验和思考,系统性地总结一下缓存更新模式,讲透讲明白。 1、旁路缓存(cache-aside) 实现方案查询:先查缓存,查不到缓存时再查DB,并把DB内容写入缓存、设置合适的…...

为什么不能在try-catch中捕获子线程的异常 ?

一、基础概念...

sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践

sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...

2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过

2025 PHP 开发者必看得 25 个容易犯的常见错误 90% 的开发者都踩过 前言 PHP 发展到今天,新特性层出不穷,最佳实践也在不断更新。写出干净、高效、好维护的代码,对每个 PHP 开发者来说都很重要。 这篇文章总结了 PHP 开发中最容易踩的坑,以及对应的解决方案。 不管你是刚入…...

一款带有AI功能的markdown工具

大家好,我是晓凡。 写在前面 关注晓凡的同学都知道,晓凡是一名程序员。 平常有空的时候会写写博客,将一些技术干货或者踩过的坑分享给大家。 和我一样写技术博客的小伙伴都知道,平常素材来源太杂:脑子里突然而来的灵感 群里的一张梗图 随手的一张截图 读书看到的一段文字 …...

45万亿!中国智驾的新风口来了

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选)2025年L4智驾场景化应用加速发展,亿欧汽车研究院认为2035年中国L4级别及以上智能驾驶…...

apache poi 导出繁琐的excel表格

apache poi 导出繁琐的excel表格pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

Ubuntu Server SSH 连接

使用 SSH 连接(最推荐的方式) 这是最专业、最稳定的方式,特别适合服务器环境:一、在 Ubuntu Server 中确保 SSH 服务已安装并运行: sudo apt update sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh 二、获取虚拟机的 IP 地址: …...

利用竞态条件轻松上传Web Shell

本文详细介绍了如何通过竞态条件漏洞上传PHP Web Shell,使用普通Burp Intruder工具而非Turbo Intruder,包含完整的攻击步骤、PHP代码分析和实战配置,适合初学者理解文件上传漏洞的利用方式。通过竞态条件上传Web Shell(简易方法) 方法特点 本攻击使用普通Burp Intruder而非…...

我亲眼目睹我上海的家长朋友陷进去了

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 354695541004908701我发现在网上很多人都在说不要内卷了,不要卷了,因为我们快被自己人卷死了。我这人天生迟钝,后知后觉的,所以总是赶不上时…...

蔚小理的辅助驾驶,谁最拉跨?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087汽车诞生以来,从来没试过像现在这样,一台车可以在买回来之后,不花一分钱,表现就能获得提升。而且还不只是那些贵的车型,就…...

C 语言的 printf() 函数

概述 printf() 的作用: Print formatted output to the standard output stream. printf() 的函数原型: int printf( const char *format, argument1, argument2, ... );printf() 函数的基本格式: printf(格式字符串, 待打印项列表);或者写为: printf(格式字符串, 待打印项 1,…...

【GitHub每日速递 250915】3 个宝藏开源项目:超长语音合成、算法学习库、自托管软件导航,开发者速收

原文:【GitHub每日速递 250915】3 个宝藏开源项目:超长语音合成、算法学习库、自托管软件导航,开发者速收 VibeVoice:挑战传统TTS,最长90分钟多角色语音合成神器来袭! VibeVoice 是一个长对话文本转语音模型的开源项目。简单讲,它能将连续的文本内容自然地转换成语音,支…...

C 语言头文件

两种写法: #include <stdio.h> // 编译系统在系统头文件所在目录搜索 #include "stdlib.h" // 编译系统首先在当前的源文件目录中查找 stdlib.h,找不到的话,再转向系统头文件所在目录搜索引用系统头文件时,使用两种形式都可以,但是 #include <> 的…...

AFL++环境搭建

第 1 步:更新软件源并安装基本工具 首先更新软件包列表 sudo apt update 升级现有软件包 sudo apt upgrade -y 安装基本编译工具(包括gcc) sudo apt install -y build-essential 安装Python3和相关工具 sudo apt install -y python3 python3-dev python3-pip 创建python符号…...

晚安

cai~一定是做梦,不然还能是什么,对不对? 总之就是梦到一年前的自己对我说话: 第一句:变菜了 第二句:本来就挺菜 然后开始大笑,前车窗上晃动着一双眼睛,小,但是不瞎。...

读人形机器人12体育领域

读人形机器人12体育领域1. 体育领域 1.1. 在体育竞技这个不断挑战人类极限的领域,人形机器人正以教练和训练助手的身份进入 1.2. 由金属材料、代码和AI技术打造的机器人,正在革新运动员的训练方式、恢复过程和竞技表现 2. 个性化训练计划 2.1. 追求卓越的运动表现既是一门科学…...

【QT】C++基础

前言 目前打算一周内学习QT的基本使用,从此篇"C++基础"文章开始记录分享学习经验。 C++及其各种定义C++是面向对象的,什么是面向对象,什么是面向过程? 举例 计算a+b的值: C语言,直接计算a+b;C++,先将a+b封装,封装到类里面形成一个方法,然后再通过这个类去…...