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

setTimeout、setInterval、requestAnimationFrame的使用以及区别

setTimeoutsetIntervalrequestAnimationFrame 都是 JavaScript 中用于处理异步任务的函数,但它们在用途、执行机制和精度方面存在显著差异。让我们分别解释它们的特点、区别和用法:


1. setTimeout

特点:
  • 一次性执行:在指定的延迟时间后执行一次函数。
  • 延迟单位:以毫秒(ms)为单位。
  • 不精确:实际执行时间可能略晚于指定时间,因为其依赖于浏览器的任务队列。
  • 用途:适用于需要在一段时间后执行某个任务的场景,例如延迟加载、动画等。
用法:
setTimeout(function, delay);
  • function:要执行的函数。
  • delay:延迟时间,单位为毫秒。
示例:
console.log('Start');setTimeout(() => {console.log('Executed after 2 seconds');
}, 2000);console.log('End');

输出:

Start
End
Executed after 2 seconds

2. setInterval

特点:
  • 重复执行:每隔指定的时间间隔重复执行函数。
  • 延迟单位:以毫秒(ms)为单位。
  • 不精确:实际执行时间可能不准确,尤其是在浏览器忙碌时,可能会累积延迟。
  • 用途:适用于需要周期性执行任务的场景,例如定时器、轮询等。
用法:
setInterval(function, delay);
  • function:要执行的函数。
  • delay:时间间隔,单位为毫秒。
示例:
let counter = 0;const intervalId = setInterval(() => {console.log('Counter:', counter++);if (counter >= 5) {clearInterval(intervalId); // 停止定时器}
}, 1000);

输出:

Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5

3. requestAnimationFrame

特点:
  • 与浏览器刷新率同步:在浏览器下一次重绘之前执行回调函数,确保动画流畅。
  • 高精度:实际执行时间与浏览器的刷新率(通常是 60fps)同步。
  • 节能:当页面不可见时,requestAnimationFrame 会暂停调用,节省资源。
  • 用途:适用于动画、游戏等需要高帧率的场景。
用法:
requestAnimationFrame(callback);
  • callback:要执行的函数,会在下一次重绘之前调用。
示例:
function animate() {// 动画逻辑console.log('Animating...');requestAnimationFrame(animate); // 递归调用,实现动画循环
}requestAnimationFrame(animate);

输出:

Animating...
Animating...
Animating...
...

区别总结:

特性setTimeoutsetIntervalrequestAnimationFrame
执行次数一次性重复执行重复执行(直到手动停止或页面不可见)
执行时机延迟后执行每隔固定时间执行与浏览器重绘同步执行
精度不精确(可能延迟)不精确(可能累积延迟)高精度(与刷新率同步)
节能性页面不可见时自动停止
适用场景延迟任务、超时处理周期性任务、轮询动画、游戏、高帧率任务

选择建议:

  • 如果需要一次性延迟执行任务,使用 setTimeout
  • 如果需要周期性执行任务,且对精度要求不高,使用 setInterval
  • 如果需要实现流畅的动画或与浏览器刷新率同步的任务,使用 requestAnimationFrame
http://www.lryc.cn/news/592695.html

相关文章:

  • LeetCode1047删除字符串中的所有相邻重复项
  • Kubernetes Pod深度理解
  • 20250718-6-Kubernetes 调度-Pod对象:环境变量,初始容器,静态_笔记
  • LLM(Large Language Model)大规模语言模型浅析
  • 【c++】中也有floor函数吗?他与JavaScript中的floor有啥区别?
  • RPC 与 Feign 的区别笔记
  • Nestjs框架: 基于TypeORM的多租户功能集成
  • Java全栈面试实录:从Spring Boot到AI大模型的深度解析
  • 北斗网格位置码详解:经纬度到二维网格码的转换(非极地)
  • 智能点餐推荐网站,解决选择困难
  • Honeywell霍尼韦尔DV-10 变速器放大器 输入 15-28 VDC,输出 +/- 10VDC 060-6881-02
  • 数字化转型:概念性名词浅谈(第三十讲)
  • GaussDB join 连接的用法
  • 工业互联网六大安全挑战的密码“解法”
  • 聊聊 RocketMQ 4.X 知识体系
  • 【Linux】基本指令(入门篇)(上)
  • 人工智能day9——模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • Docker部署前后端分离项目——多项目共享环境部署
  • Android sdk 升级 34到35
  • 计算机“十万个为什么”之跨域
  • c语言笔记---结构体
  • 一个简单的带TTL的LRU的C++实现
  • windows终端美化(原生配置+Oh My Posh主题美化)
  • 数据交易“命门”:删除权与收益分配的暗战漩涡
  • 《通信原理》学习笔记——第四章
  • LP-MSPM0G3507学习--05中断及管脚中断
  • 【DPDK】高性能网络测试工具Testpmd命令行使用指南
  • ELK结合机器学习模型预测
  • mysql not in 查询引发的bug问题记录
  • RV126平台NFS网络启动终极复盘报告