<前端> js定时器模拟及相关问题

在这里插入图片描述内容简单,文字略多,各位耐心观看!

面试 JS 基础中可能会遇到面试官问,如何用 setTimeout 来模拟 setInterval

这边代码直接附在图中 非常简单不做过多赘述,各位小伙伴可以自行理解~
在这里插入图片描述
首先回顾一下,js 定时器有以下两个方法:setInterval() :按照指定的周期来调用函数或计算表达式。方法会不停地调用函数,直到clearInterval() 被调用或窗口被关闭。
setTimeout() :在指定的毫秒数后调用函数或计算表达式,仅调用一次。

然后做一个引申问题(其实很少会问):
为什么要用 setTimeout 来模拟 setInterval 呢? 我们总不能和面试官说,是你刚刚让我模拟的吧==

还是先给出结论👉是由于 setInterval 定时器在使用时可能会存在问题。

首先执行如下代码 setInterval ( fn , time )意思是:函数fn在每隔time毫秒之后被推入任务队列,这里注意是推入任务队列,不是直接放入任务队列。

问题1:在 setInterval 被推入任务队列时,如果在它前面有多个任务或某个任务等待时间较长这种情况时,那么这个定时器的执行时间和我们预定它执行的时间可能并不一致。也就是,如果上一次推入的代码没有执行,那么这次的推入代码将不会被放入队列,会被跳过。

问题2:如果我们定时器里面的代码需要进行大量的计算,花费的时间就会比较长,那么我上一次的代码还没有执行完毕,那么我又推入了下一次的代码去任务队列,这个时候就会变得不准确。简单说,假如 fn 执行时间大于 time 周期的话,因为他必须执行完上一个后才会去执行下一个,假如上一个使用时间超过间隔时间,下一个函数会在上一个函数执行结束之后立即执行,所以间隔不准确。 而相对于每个 setTimeout 产生的任务会直接 push 到任务队列中~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值