定时器 setTimeout、setInterval详解

这篇具有很好参考价值的文章主要介绍了定时器 setTimeout、setInterval详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定时器:按我个人理解来说就是固定某个时间后,时间到了,就提醒我时间到了。

程序中的定时器:相当于倒计时,也相当于计时器。作用是在设定的某个时间后,执行特定的方法。

我们先来了解一下setTimeout定时器,他的特点就是只能用一次,也称为一次性定时器。


setTimeout( func, time, argument1, argument2, .... );

语法解析: 

  1、func:固定时间后执行的方法
  
  2、time:设置固定的时间-按毫秒计算

  3、argument:传入方法的参数

案例:

	setTimeout(function(name,gender){
		console.log(name + " is " + gender);
	}, 1000, "Tom", "boy");

简写:

	setTimeout((name,gender) => {
		console.log(name + " is " + gender);
	}, 1000, "Tom", "boy");

案例解析:

开启了一个一次性定时器,1秒后执行我给定的函数。

接着看看 setInterval定时器,他的特点就是可以重复执行给定的函数。


setInterval ( func, time, argument1, argument2, .... );

语法解析: 

同 setTimeout参数意义一致

案例:

	setInterval(function(name,gender){
		console.log(name + " is " + gender);
	}, 1000, "Tom", "boy");

简写:

	setInterval((name,gender) => {
		console.log(name + " is " + gender);
	}, 1000, "Tom", "boy");

案例解析:

开启了一个重复定时器,每隔1秒执行我给定的函数。

接下来就开始圈重点了:
定时器概念了解了,也会造定时器了,那这个定时器什么时候调用呢,因为我们的 javaScript代码是从上到下,逐行执行,那到了定时器这行我们的进程会不会等定时器执行完了再执行定时器后面的代码呢?答案是不会等!

遇到定时器,会将定时器加入到任务队列中(宏任务),等所有代码执行完了,程序会看一下队列中还有什么没有完成的 ,如果有没完成的,就执行一下。

这样说可能有点抽象,看下案例好了。


console.log("1 ===>");

setTimeout(function(name,gender){
    console.log(name + " is " + gender);
}, 1000, "Tom", "boy");

console.log("2 ===>");

执行结果:
> "1 ===>"
> "2 ===>"
> "Tom is boy"

注意:任务队列里的执行顺序是按先来后到的

接下来再深入理解一下,我们先思考一个问题,一次性定时器和重复性定时器区别在哪,不可能就只是调一次和调多次这么简单吧。

提醒:接下来的内容比较重要,有点抽象但需要理解透彻

案例:假设我们需要每隔一秒控制台输出一句话。

结合我们本文的学习,给出思路:

1、一次性定时器的函数里再调定时器,形成循环。

2、开启一个重复性定时器

编写实现代码:

思路1:

setTimeout(function run(name,gender){
  console.log(" hello");
  setTimeout(run,1000);
}, 1000);

思路2:

setInterval(()=>{
	console.log("hello")
},1000);

看到这大家可能会不禁感叹,就这?就这?这哪复杂了,逗我呢。
那不妨思考一下,第二个一次性定时器啥时候开始执行呢?第三个呢?第n个呢?程序运行的第n秒?

那我稍微改造一下刚刚的案例好了


setTimeout(function run(name,gender){
  console.log("1 ===>");
  setTimeout(run,1000);
  console.log("2 ===>");
}, 1000);

接着可以思考一下输出的结果是什么。

然后再来思考重复性定时器,第二次函数调用是啥时候执行呢?第三个呢?第n个呢?

再稍微改造一下好了


let start = Date.now(); // 程序一运行的时间
let times = []; // 用来记录运行时间的数组

let sTime = setInterval(()=>{
  times.push(Date.now() - start); // 记录下执行时间
  if (start + 5000 < Date.now()) {
    console.log(times);
  }
},1000);

好了,留些时间思考一下…

思考好了吗,好了的话一起揭晓一下答案吧。


第一种情况:
> "1 ===>"
> "2 ===>"
> "1 ===>"
> "2 ===>"

第二种情况:
> Array [1001, 2003, 3003, 4000, 5000, 6000]

分析:
情况1:思考这个问题就可 -> 输出 "1 ===>" 之后我开启了另一个定时器,此时是不是应该再输出"1 ===>"?

然后就进入了定时器循环,结果一直只有"1 ===>"?

结合我们的结果,可以发现下一个定时器是什么时候开的?没错,执行完第一个定时器函数内的代码后再执行的。

情况2:根据时间的间隔很容易知道时间就是1秒上下几毫秒,所以下一个定时器是第一个定时器时间结束后立即开启的。

这就是他们两个比较靠底层的区别。

总结的话就留给大家自己总结吧,毕竟一千个读者就会有一千个读者(哈哈,开个玩笑,说句可能像话的话😄)。

现在我们已经大致了解了定时器以及触发时间,那么会造定时器了不会取消就有点说不过去了,下面一起看看怎么取消定时器。



let timerId1 = setTimeout(...);
clearTimeout(timerId1); // 取消一次性定时器,timeId1 是唯一且必传参数

let timerId2 = setInterval(...);
clearInterval(timerId2)。 // 取消重复定时器,timeId2 是唯一且必传参数

注意:定时器开启了一定要关闭,要做到有始有终,不然会一直消耗内存,到时候就就很容易程序崩溃。

还有一个留最后讲的,因为比较细节。

下面我们来看个案例


let start = Date.now();
let times = [];

setTimeout(function run() {
  times.push(Date.now() - start); // 保存前一个调用的延时

  if (start + 50 < Date.now()) console.log(times); // 100 毫秒之后,显示延时信息
  else setTimeout(run); // 否则重新调度
});

结果:

> Array [1, 2, 4, 5, 9, 13, 18, 22, 27, 32, 36, 42, 46, 50, 55]


let start = Date.now(); // 程序一运行的时间
let times = []; // 用来记录运行时间的数组

let sTime = setInterval(()=>{
  times.push(Date.now() - start); // 记录下执行时间
  if (start + 50 < Date.now()) {
    console.log(times);
    clearInterval(sTime); // 清除定时器
  }
});

结果:

> Array [1, 2, 3, 4, 8, 13, 16, 20, 25, 28, 32, 36, 40, 44, 48, 53]

感兴趣的同学可以分别思考一下这两组数组的规律,然后再往下看

好了,这就不卖关子了,直接把结论告诉大家吧

浏览器会将 setTimeout 或 setInterval 的五层或更多层嵌套调用(调用五次之后)的最小延时限制在 4ms。这是历史遗留问题。

最后,大家拷贝案例执行的时候,运行的结果很大概率和我这个结果不一样,影响的因素有浏览器版本、类型等等问题。不过这也不影响结论是正确的 ^ _ ^ , 好了,文章到这就结束了,有问题大家可以在评论区留言哈,拜拜👋文章来源地址https://www.toymoban.com/news/detail-401690.html

到了这里,关于定时器 setTimeout、setInterval详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3 setup语法糖销毁一个或多个定时器(setTimeout或setInterval)

    如果在页面/组件增加了定时器,就算跳转到其他页面,定时器也不会被清理,这时候就需要手动清理,不然会有意想不到的bug,也会影响性能。 setTimeout是只执行一次,setInterval是循环执行,以下是用setTimeout举例子,如果想要用setInterval,替换一次方法就行。 setTimeout替换成

    2024年02月13日
    浏览(35)
  • JS 定时器setInterval()

    过多的就不描述了,可以直接参考官方文档: 官方文档:https://developer.mozilla.org/en-US/docs/Web/API/setInterval 参考文档:https://www.jianshu.com/p/55b4eb04b1d3 直接上干货 setInterval(参数1,参数2) setInterval(方法名, 1000 * 60 * 1); 描述:定时执行 间隔执行 注意: 1.参数1可以是一个匿名函数 也可以是

    2024年02月13日
    浏览(39)
  • js:定时器setInterval、clearInterval的使用

    定时器:可以在固定时间间隔,重复调用一个函数 文档 https://developer.mozilla.org/zh-CN/docs/Web/API/setInterval 常用的语法 为了避免this指向问题,一般使用箭头函数 输出结果

    2024年02月04日
    浏览(34)
  • 记录--你敢信?比 setTimeout 还快 80 倍的定时器

    很多人都知道, setTimeout 是有最小延迟时间的,根据MDN 文档 setTimeout:实际延时比设定值更久的原因:最小延迟时间中所说: 在浏览器中, setTimeout() / setInterval() 的每调用一次定时器的最小间隔是 4ms,这通常是由于函数嵌套导致(嵌套层级达到一定深度)。 在HTML Standard规范

    2024年01月24日
    浏览(35)
  • uni-app使用plus本地推送通知栏信息,不使用第三方个推实现消息在线统一推送、消息通知(MQTT、WebSocket、setInterval定时器)

    plus.push.createMessage() 因项目一直是运行在内网,所以不支持使用uni-push等运行在公网的第三方个推渠道。 那就只能使用 plus.push.createMessage() ,示例代码如下: 参数解释: content : ( String 类型) 必选,消息显示的内容,在系统通知中心中显示的文本内容。 payload : ( String 类型 ) 可

    2024年02月15日
    浏览(34)
  • STM32定时器-定时器中断功能详解

    STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能,下面我们就以通用定时器为例进行讲解,其功能和特点包括: 通用与基本定时器(2~7)位于低速的APB1总线上 高级定时器(1、8)位于高速的APB2总线上 自动装载计

    2024年02月08日
    浏览(34)
  • STM32 MCU 定时器详解(3)--高级定时器

    16位递增、递减、中心对齐计数器(计数值:0~65535) 16位预分频器(分频系数:1~65536) 可用于触发DAC、ADC 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式 使用外部信号控制定时器且可实

    2024年04月17日
    浏览(36)
  • 定时器详解 -- 定时器中断、PWM输出 --stm32

    STM32F103系列芯片拥有多种定时器,包括基本定时器、通用定时器和高级定时器,每种定时器都具有一些特定的功能。 向上计数:计数器从0计数到自动重装载值(ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数:计数器从自动重装载值(ARR)开始向下计数

    2024年02月11日
    浏览(49)
  • STM32 MCU 定时器详解(1)--基本定时器

    定时器是一种电子组件,主要用于定时控制,具备精确计时的能力。它可以在设定的时间间隔内触发特定的操作,如发送数据、采集传感器信息、检测输入信号或产生规律性输出波形。这种灵活性使定时器在多个行业中得到广泛应用,支持各种复杂功能的实现,是现代电子系

    2024年02月22日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包