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 ...
随机推荐
- nvm在windows下安装与使用
1.卸载本地已经安装的所有node 2.nvm下载 下载地址https://github.com/coreybutler/nvm-windows ,选择nvm-noinstall.zip 放在本地盘, ...
- 10s后再次获取手机验证码
一般手机验证码获取都会加个间隔时间 js代码如下: function getDxCode(btn){ var reg = /^1[3|4|5|7|8][0-9]{9}$/; //验证规则 var mo ...
- Arduino教程目录
目录 第一节.安装Arduino开发环境 第二节.第一个HelloWorld 第二节续.LED操作 呼吸灯 流水灯 正在加快制作,大家可以先看下面的视频了解基本语法,我准备基础课程和实际项目结合讲解. ...
- pandas(随时更新)
pandas处理一个表中的一列数据被另一个表中的另一列数据替换: df1=pd.DataFrame({'id':[1,2,3],'name':['Andy1','Jacky1','Bruce1']}) ...
- 全面加速 GitHub,git clone 太慢的 9 种解决办法
https://cloud.tencent.com/developer/article/1835785
- String类型时间与Date时间转换
1. String类型的时间转为DateTime public static Date transferString2Date(String s) { Date date = new Date(); ...
- Docker安装一些软件
1.Docker开始远程访问 vim /lib/systemd/system/docker.service 在ExecStart的值最最后面追加:空格+-H tcp://0.0.0.0:2375 sy ...
- MySQL增加多用户及数据库
登录MYSQL(有ROOT权限),这里以ROOT身份登录: @>mysql -u root -p @>密码 首先为用户创建一个数据库(yc): mysql>create databa ...
- mysql创建函数时提示1418。可选关闭二进制日志或者设置log_bin_trust_function_creators=1
报错详情如下:1418--This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration a ...
- PyTorch中的矩阵乘法
1. 二维矩阵乘法 , 其中 , , 输出 的维度是.该函数一般只用来计算两个二维矩阵的矩阵乘法,而且不支持broadcast操作. 2. 三维带Batch矩阵乘法 由于神经网络训练一般采用mi ...