JavaScript中计时器requestAnimationFrame、setTimeout、setInterval、setImmediate的使用和区别
在JavaScript中,我们经常使用requestAnimationFrame、setTimeout、setInterval和setImmediate来控制代码的执行时机。它们各有特点和适用场景:
1. requestAnimationFrame: requestAnimationFrame主要用于浏览器动画渲染。这个函数允许你在下一次浏览器重绘前调用一个函数。它提供了一个高精度的时间戳,可以在函数内部使用。由于浏览器可以在重绘前执行动画,这可以提高动画效果的性能。
使用:
function animate() {
// 动画逻辑
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
2. setTimeout: setTimeout用于在指定的时间后执行一次回调函数。它返回一个timeoutID,可以用来取消这个计时器。
使用:
const timeoutID = setTimeout(function() {
// 任务代码
}, 2000); // 2秒后执行
// 取消计时器
clearTimeout(timeoutID);
3. setInterval: setInterval用于每隔一定时间间隔重复执行回调函数。它同样返回一个intervalID,可以用来取消这个计时器。
使用:
const intervalID = setInterval(function() {
// 任务代码
}, 1000); // 每隔1秒执行一次
// 取消计时器
clearInterval(intervalID);
4. setImmediate: setImmediate的功能类似于setTimeout,但是它会在当前事件循环结束后立即执行回调函数,而不是等待指定的时间。需要注意的是,setImmediate并不是所有浏览器都支持,主要用于Node.js环境。
使用(Node.js环境):
const immediateID = setImmediate(function() {
// 任务代码
});
// 取消立即执行
clearImmediate(immediateID);
这四个方法的执行时机有所不同:
1. requestAnimationFrame:
requestAnimationFrame 的执行时机是在浏览器准备好绘制下一帧屏幕时,也就是在浏览器每次重绘页面之前。这样可以让动画更加流畅,并且避免不必要的计算。当页面处于隐藏状态时,requestAnimationFrame 不会运行,这样可以减少资源的浪费。
2. setTimeout:
setTimeout 的执行时机是在指定的延迟时间之后,只会执行一次。具体执行时间可能会因为浏览器当前的工作负载而有所偏差。
3. setInterval:
setInterval 的执行时机是在指定的时间间隔之后,每隔指定的时间就会执行一次,直到被清除。
4. setImmediate:
setImmediate 的执行时机是在当前事件循环迭代结束后立即执行,相当于将回调函数插入到事件队列的头部。
综上所述,requestAnimationFrame 的执行时机与浏览器的重绘时间有关,setTimeout 和 setInterval 的执行时机与指定的时间间隔有关,而 setImmediate 的执行时机则是在当前事件循环迭代结束后立即执行。
这四个方法之间的区别如下:
1. requestAnimationFrame:
- 用于动画效果的开发,以优化动画的性能。
- 在浏览器准备好绘制下一帧屏幕时调用传入的回调函数。
- 不会在页面隐藏或最小化时运行,从而减少资源浪费。
- 调用频率与屏幕刷新率同步,可以提供平滑的动画效果。
2. setTimeout:
- 延迟一定时间后调用传入的回调函数。
- 仅调用一次。
- 时间精度不太准确,会受到浏览器当前忙碌程度的影响。
- 用于创建简单的计时器、轮询和非重要操作。
3. setInterval:
- 在一定时间间隔后调用传入的回调函数,直到被清除。
- 可以用于创建重复执行的计时器、轮询和非重要操作。
- 时间精度不太准确,同样会受到浏览器当前忙碌程度的影响。
4. setImmediate:
- 在当前事件循环迭代结束后立即执行传入的回调函数。
- 相当于将回调函数插入到事件队列的头部。
- 用于在一些异步操作完成后立即执行回调函数。
总体而言,requestAnimationFrame 适用于动画开发,setTimeout 和 setInterval 适用于计时器、轮询等需要延迟执行的操作,而 setImmediate 则适用于需要立即执行的回调函数。
JavaScript中计时器requestAnimationFrame、setTimeout、setInterval、setImmediate的使用和区别的更多相关文章
- JavaScript中变量声明有var和没var的区别
JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ...
- 在Javascript中 声明时用"var"与不用"var"的区别,== 和 ===的区别
今天,被问到两个JS问题,当时没回答到重点,问题虽然看起来简单,但是细节却马虎不得,在此做下记录: 1. 在Javascript中 声明时用"var"与不用"var&qu ...
- 【转载】在Javascript中 声明时用"var"与不用"var"的区别
原文链接:http://www.2cto.com/kf/201204/128406.html[侵删] Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有 ...
- javascript线程解释(setTimeout,setInterval你不知道的事)
john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...
- javascript中使用new与不使用实例化对象的区别
我们先来看个实例 function Me(name,age,job){ this.name = name; this.age = age; this.job = job; } 请问这以下两种实例化对象 ...
- JavaScript中的call、apply、bind方法的区别
在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...
- JavaScript中.、[]与setAttribute()在设置属性上的区别
.和[] javaScript.和[]既可以对所有js对象设置属性,但是对于DOM对象它设置的属性有些特殊.对于元素DOM标准属性,实现属性值的设置/更改;对于元素DOM非标准属性,仅在js中有效,在 ...
- javascript线程解释(setTimeout,setInterval你不知道的事)---转载
在工作中,可能我们经常遇到在有很多 setInterval 的页面, 再手动触发 setTimeout 的时候经常失败, 尤其是 jquery做动画的时候,一些渐入溅出的东西,很多东西都不被触发……, ...
- JavaScript中函数引用调用和函数直接调用的区别
首先看下面的代码: var x = 1 var f1 = function( f ) { var x = 2 ; f( ' console.log( x ) ' ) } var f2 = funct ...
- JavaScript中instanceof运算符的用法以及和typeof的区别
instanceof : 判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例:返回boolean类型栗子①: var aColors = ["red", "g ...
随机推荐
- webpack devserver proxy 配置以及react多页面
github地址: https://github.com/yangstar/React-antd-webpack-dev-server var webpack = require('webpack') ...
- jmeter 压测的执行步骤步骤
一.设置测试参数 如图 Number of Threads:总共起多少个线程. Ramp-UP Period(in seconds):多少秒启动完所有线程. loop Count:循环次数 Sched ...
- guava缓存
Guava Cache有一些优点如下 :1. 线程安全的缓存, 与ConcurrentMap相似(前者更"好"), 在高并发情况下.能够正常缓存更新以及返回.2. 提供了三种基本的 ...
- CentOS 8.x下编译php 7.4、php5.6、php5.3多版本报错处理教程
一.编译安装php 7.4.x 参考CentOS 8.0.1905编译安装Nginx1.16.1+MySQL8.0.18+PHP7.3.10 1.安装编译工具及库文件(使用yum命令安装) yum i ...
- 20220720 第七组 陈美娜 Java String用法
关于String引用数据类型 1.字符串中,两个变量的==指的是虚地址 2.String一旦声明不可改变:赋值进去,原值不会被替代.原值也可能指向其他地址: 3.s.length():字符的个数 4. ...
- UCID数据集
UCID数据集,做实验使用, 免费分享. 自取 链接:https://pan.baidu.com/s/1etMgXShdd_tJFHWbP3ipNw 提取码:62ww
- pntia7-7 软硬车厢交替排列 (40 分)
7-7 软硬车厢交替排列 (40 分) 设车辆厂生产了硬座车厢和软座车厢共n节(混合在一起),要求使用队列的基本操作,编程实现所有硬座车厢和所有软座车厢交替排列. 例如硬座车厢用H来表示,软座车厢用S ...
- Visual Studio 2022 离线包手动下载和清理
下载离线vsvs_Professional.exe --layout e:\vs2022 --all --includeRecommended --includeOptional --lang zh- ...
- (瞎学系列)RISC-V & ARM & x86
reduced instruction set computing (RISC) -> ARM & RISC-V complex instruction set computing (C ...
- web自动化--窗口切换
窗口切换 handles = driver.window_handles ------获取所有窗口句柄,返回的数据是一个列表类型 driver.switch_to.window(handles[-1] ...