一、写在前面
刷了一道面试题,问的是setInterval为什么要用setTimeout来模拟呢?
,看了别人的一些文章,加上自己的理解,我将其总结一下。
二、setInterval的弊端
如下所示为setInterval执行函数
setInterval(fn(), N);
我们了解js的事件循环机制就明白了,setInterval
并不是说当过了时间N之后就会执行fn函数,其实是过了时间N后,fn函数才会被放入事件队列中等待执行。此时下一个定时器就会开启计时,所以如果主线程中的任务需要等待的时间特别长,则就会在事件队列中堆积的fn函数特别多,导致最终这些函数都会一起执行。完全没有定时的效果,这就是setInterval
的弊端。
三、使用setTimeout来模拟setInterval
我们看这一个例子:
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
这里的最终结果是:一秒钟之后一次性打印5个5。为什么?
因为for循环是主线程代码,所以在for循环会一次性执行,并且同时创建5个定时器。当1秒之后,定时器会立即执行,一次性打印5个5。使用setTimeout来模拟setInterval
<script>
function mysetInterval(func, timer) {
let tis = {
flag: true
}
function intival() {
if(tis.flag) {
func()
setTimeout(intival, timer)
}
}
setTimeout(intival, timer)
return tis
}
let s = mysetInterval(() => {
console.log('hhhhh')
}, 1000)
// 5秒钟停止
setTimeout(() => {
s.flag = false
}, 5000)
</script>
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_47450807/article/details/123384053
内容来源于网络,如有侵权,请联系作者删除!