js三种定时器语法和异同

本文介绍了JavaScript的三种定时器,包括setTimeout、setInterval和requestAnimationFrame,阐述了它们的使用方法、区别、优缺点以及在实际场景中的应用。特别提到了requestAnimationFrame的动画优化特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知js定时器有两种 setTimeout和setInterval 还有一个新增的requeTanimationFrame(动画API)也被加入到了面试经常考察的范围,那么我就从是什么 怎么用,什么时候用,他们的区别是什么来简述一下这三者的关系

1、setTimeout(延时器)

setTimeout完整的写法其实是window.setTimeout 是window的一个属性,由于window是全局作用域,通常我们写的时候就省略了

setTimeout()方法用来指定某个函数或字符串在指定的毫秒数之后执行它返回一个整数,表示定时器的编号,这个值可以传递给clearTimeout()用于取消这个函数的执行

setTimeout有两个参数,第一个是function:表示将要执行的函数或者代码,这里可以
第二个参数delay是推迟执行的毫秒数。如果省略就是马上执行

在ie9以下 只允许setTimeout执行两个参数
ie9以上可以多个参数
还有一个不常用的第三个参数:
在MDN中是这样解释的
在这里插入图片描述

清除setTimeout方法:
setTimeout()对应的是 clearTimeout(id);

2、setInterval (定时器)

同样 setInterval也是window上的方法,window被省略

setInterval() 方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟。

每次调用都有固定的时间间隔,会返回一个时间间隔ID 该ID唯一地标识时间间隔,在清除定时器的时候就调用此ID来清除。

同样的 setInterval和setTimeout的参数相同都是三个

function code
delay
arg1, …, argN 可选
这里我就不重复了

清除定时器的方法:

setInterval()对应的是 clearInterval(id);

一个小问题:setInterval有什么缺点呢:

1.不去关心回调函数是否还在运行
在某些情况下,函数可能需要比间隔时间更长的时间去完成执行。比如说是用setInterval每隔5秒对远端服务器进行轮询,网络延迟,服务器无响应以及其他因素将会阻止请求按时按成。结果会导致返回一串无必要的排成队列请求。
2.忽视错误
因为某些原因,setInterval调用的代码中会出现一个错误,但是代码并不会中止执行而是继续执行错误的代码。
3.缺乏灵活性
除了前面提到的缺点之外,我非常希望setInterval方法能有一个表明执行次数的参数而不是无休止的执行下去。

3、requeTanimationFrame(动画API)

这个点我也是在复习面试的时候发现的
先来看MDN怎么解释这个API的

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行>

会返回一个callback参数
下一次重绘之前更新动画帧所调用的函数(即上面所说的回调函数)。该回调函数会被传入DOMHighResTimeStamp参数,该参数与performance.now()的返回值相同,它表示requestAnimationFrame() 开始去执行回调函数的时刻。

也就是说 requeTanimationFrame不需要设置时间间隔,大多数电脑显示器的刷新频率是60hz,大概相当于每秒钟重绘60次,大多数浏览器都会对重绘操作加以限制,不炒股欧显示器的重绘频率,一次超过显示屏频率用户体验也不会提升,所以最佳循环事件是1000ms/60,约等于16.6ms

特点:
requestAnimationFrame会把每一帧中所有的DOM操集中起来,在一次重绘或者回流中完成,并且重绘或回流的时间间隔会紧紧跟随浏览器的刷新频率
在隐藏或者不可见的元素中,requestAnimationFrame将不会进行重绘,这就意味着更少的cpu GPU和内存的使用量
requestAnimationFrame是由浏览器专门为提供的api 在运行的时候浏览器会自动优化方法的调用,并且如果页面不是激活状态的话,动画会自动暂停,有效节省了CPU的开销。
官网文档地址

4、这三个方法什么时候应用

setTimeout用于延迟执行某方法或功能
setInterval则一般用于刷新表单,对于一些表单的假实时指定时间刷新同步

5、setInterval和setTimeout的区别

1、setTimeout在规定的时间后使用一次就停止操作了
setInterval会按照这个规定的时间一直循环下去

2、两种定时器清除方法不一样
setInterval()对应的是 clearInterval(id);
setTimeout()对应的是 clearTimeout(id);

6、使用setTimeout实现setInterval

原理:

在setTimeout内部调用function的时候再次调用setTimeout方法 实现循环定时达到setInterval的效果

代码实现:
简单版本:

setTimeout(function(){
 <span class="token comment">//do something </span>

 <span class="token function">setTimeout</span><span class="token punctuation">(</span>arguments<span class="token punctuation">.</span>callee<span class="token punctuation">,</span>interval<span class="token punctuation">)</span><span class="token punctuation">;</span>

},interval)

复杂版本:

function interval(func, w, t){
var interv = function(){
if(typeof t === “undefined” || t-- > 0){
setTimeout(interv, w);
try{
func.call(null);
}
catch(e){
t = 0;
throw e.toString();
}
}
};
setTimeout(interv, w);
};
这个interval函数有一个叫做inter的内部函数,它通过setTimeout来自动被调用,在inter中有一个闭包,它检查了重复次数,调用了回调函数并通过setTimeout再次调用了interv。万一回调函数中出现了一个异常,interv调用将会终止,异常也会被抛出。
当然不能保证函数在固定的间隔中执行,但是它保证新的区间开始时上一个区间中的函数已经执行完毕,我认为这是非常重要的。

那么问题也来了,使用setTimeout实现setInterval和 setInterval有什么区别呢

setTimeout(fn, time),超时调用,在时间大于等于 time 时调用;
setInterval(fn, time),是间歇调用,每隔 time 调用一次。
使用setInterval()创建的定时器确保了定时器代码规则地插入队伍中。问题在于:如果定时器代码在代码再次添加到队列之前还没完成执行,结果就会导致定时器代码连续运行好几次。而之间没有间隔。不过幸运的是:javascript引擎足够聪明,能够避免这个问题。当且仅当没有该定时器的如何代码实例时,才会将定时器代码添加到队列中。这确保了定时器代码加入队列中最小的时间间隔为指定时间。
这种重复定时器的规则有两个问题:

  1. 某些间隔会被跳过
    2 多个定时器的代码执行时间可能会比预期小。
JavaScript事件添加 定时器
06-16
js 定时器是利用 js实现定时的一种方法,在网站上有很多用途都是用到 定时器,很多在线时钟的制作,图片轮播的实现,还有一些广告弹窗,但凡可以自动执行的东西,都是可以和 定时器有关的。 js 定时器使用的两个方法: 1....
js中的两种 定时器,有什么 区别?怎么清除 定时器
例如,下面的代码将每隔2秒钟打印一次"Hello World!函数,分别按照 定时器ID作为参数清除对应的 定时器
JavaScript定时器
js定时器
	</dl>
【超详细~】 js的三大 定时器:setTimeout、setInterval、requestAnimationFrame
热门推荐
04-08 24万+
js三大 定时器!进行了一个简短的总结
js的setInterval 会延迟一秒解决的最佳实践
countDown 这个函数作为定时调用的函数,通过在setInterval之后去执行原函数解决延时一秒调用的问题。但是会出现时灵时不灵的问题,通过将去掉毫秒数的方法。,最终实现完整倒计时解决;
js定时器
一、通过 定时器我们可以间隔设定时间重复调用某个函数,利用这个特性,我们可以做很多事,例如,12306上的每间隔5秒查询自动查询一次余票,简单动画的实现等等 二、 定时器的格式:    定时器有两种格式,分别是setInterval(func, time) 和 setTimeout(func, time),这两个有一些 区别   1、setInterval(func, tine);     (1)...
JavaScript 移动端点击事件延迟问题
移动端click事件会有300ms的延时,原因是移动端屏幕双击会缩放(double tap to zoom)页面。解决方案:

1.禁用缩放。浏览器禁用默认的双击缩放行为并且去掉300ms的点击延迟。
<meta name="viewport" content="user-scalable=no">
2.利用touch事件自己封装这个事件解决300ms延迟。

原理就是︰
1.当我们手指触摸屏幕,记录当前触摸时间
2.当我们手指离开屏幕,用离开的时间减去触摸的时间
3.如果时间小于150ms


关于 js中两种 定时器的设置及清除.pdf
01-04
关于 js中两种 定时器的设置及清除.pdf
JavaScript 定时器实现的 原理分析
11-26
在我们在项目中一般会遇见过这样的两种 定时器,第一种是setTimeOut,第二种是setInterval,这两种 定时器有如下的 区别: 1、setTimeout允许设置一个超时对象,超时后执行这个对象,但是只执行一次,无周期 2、...
javascript写的两种类型的进度条
10-17
javascript写的两种类型的进度条,一种采用 定时器,一种采用步进式,类似音量控制的。
微信小程序—setTimeOut 定时器的问题及解决
01-03
背景 实验室需要将项目的app搬到微信的小程序上,终于知道为什么程序员是手艺人了,...微信小程序API中有两种定时任务 setInterval setTimeOut 这两者都能实现定时任务,比如实现一个 定时器,但是建议采用后者setT
JavaScript 定时器 原理及高级使用
08-15 5605
javaScript里面内置了两个 定时器,一个是setTimeout()一个是setInterval()。下面将由浅入深来理解一下 定时器的工作 原理。使用方式:setTimeout()
javascript 函数节流 throttle 解决函数被频繁调用、浏览器卡顿的问题
* 使用setTimeout

index.html

<html>
<head>
<meta charset="UTF-8">
<title>throttle</title>
</head>
<body>
<h2>函数节流 解决函数被频繁调用、浏览器卡顿的问题</h2>
&l…


js 定时器误差解决方案
03-25 1652
js定时器存在误差遇到的问题:原因:示例:示例结果:解决方案1: 动态计算时差示例结果:解决方案2: 使用 web Worker将定时函数作为独立线程执行示例结果: 遇到的问题: 在 面试一家直播业务公司的时候, 面试官怎么解决 定时器误差实现一个精准 定时器 原因: 面试完之后,查了一些资料。原因是:Eventloop 循环机制中,异步事件 setInterval 到时后会把回调函数放入消息队列中,主线程的任务执行完毕后依次执行消息队列的任务,由于消息队列中存在大量任务,其他任务执行时间就会造成 定时器回调函数的
如何解决 js 定时器不准确问题
Web Worker 是运行在后台线程中的 JavaScript 脚本,可以与主线程并行工作,因此不会受主线程的影响。使用标准时间: 可以使用标准时间对象提供的函数(如getTime、getSeconds等)获取当前时间,而不是使用 JavaScript自带的全局变量Date来保证计时器的准确性。由于该 定时器是在 Worker 线程中运行的,因此它不会受到主线程的影响,从而保证了 定时器的准确性。根据 定时器最开始时间计算当前时间(回调函数执行时间)与开始时间的误差,用期望时差减误差作为下一次任务的时间间隔。
JS 定时器详解
10-27 2206
JS 定时器使用详解,介绍不同 定时器的使用场景
JS基础第三课( 定时器篇)
定时器(回调函数、同步、异步)、BOM、window对象的常见事件(onload、onresize)、点击切换图片效果练习代码
“import ... =“ 只能在 TypeScript 文件中使用
最新发布
当你遇到这个问题很苦恼。
SLB健康检查 原理 浅析
07-25
SLB(Server Load Balancer)健康检查是对后端服务器的健康状态进行监控和评估的一种机制。它的 原理是通过定期向后端服务器发送探测请求,并根据服务器的响应来判断服务器的健康状态。

具体来说,SLB会周期性地向后端服务器发送探测请求,常见的探测方式有Ping、TCP连接、HTTP GET等。当服务器收到探测请求后,会根据配置的规则进行处理,并返回相应的响应。

SLB会根据后端服务器返回的响应来评估服务器的健康状态。通常情况下,如果服务器能够正常响应探测请求,SLB会将其视为健康服务器,并将流量转发给它;如果服务器无法正常响应探测请求,SLB则会将其视为不健康服务器,并停止将流量转发给它。

除了基本的健康状态判断外,SLB还可以根据具体的需求进行更复杂的健康检查配置。例如,可以设置探测请求的超时时间、重试次数、探测间隔等参数,以及定义响应码范围、响应内容等规则来判断服务器的健康状态。

总的来说,SLB健康检查通过周期性地发送探测请求并根据服务器的响应来评估服务器的健康状态,从而实现对后端服务器的健康监控和负载均衡。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值