聊一下JavaScript定时器

时间:2022-04-27
本文章向大家介绍聊一下JavaScript定时器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

话说JS的定时器,常用的其实就是setTimeout和setInterval这二个。它们俩一个是运行一次就拉倒,另一个是你不叫我停我就一直跑,正好相反。这两货用不好其实挺坑的,主要是因为JS是单线程的,同一时间只能干一个事,切菜的时候,就不能把锅先放灶上,必须一个一个。就好比上厕所先大便完了,收拾好了出来,再转身进去小便。。。^_^哈哈哈,没办法

后来为了效率吧,就基于事件响应引用了异步的概念。就是主线程切菜呢,热锅这事先放在任务队列里,等切完菜了,再问问任务队列里有事没?有就将之加入主线程,来回这么折腾。

说这么半天是为什么呢?主要还是想表示说,定时器也是一个异步任务。一般正常浏览器吧都有一个定时器模块,这个延迟时间之类的就是它来管。一但任务队列里轮到它了,它就进入主线程了。但因为JS是单线程的嘛,就是setTimeout(funct..(),n),n秒之后执行,这个n啊,如果是一个定时器还OK。如果你页面上有多个定时器,然后你之前的还没及时清除,那你就来吧,多个定时器就互相干扰。这个场景太美,我就不用语言描述了,你多搞几个setTimeout之类的自己体会下吧。

setTimeout互相干扰的大概原理吧,就是setTimeout(func..., n),是说n秒之后就把func函数加入主线程开始执行。但如果在它之前的那个程序特别大或慢,那按正理得等前面那个任务把事办完才行。但如果定时器之前的这个任务特别慢,超级慢,,,用了一分钟才完事。那你如果定时是5秒之后执行fn函数的话,事实上也许将要等一分钟

如果是setInterval呢,那就更坑,坑的n次方。为什么呢?首先setInterval就是重复执行的,你不说停我不停的这种。其次,setInterval(fnuc,100),你以为是func执行完之后间隔100再执行下一次?图样啊,这货根本不管你上次是否执行完成!来吧哥们,它其实是每100ms就放一个任务到主线程执行一次。就好比,你每天切100棵大白菜,你以为是切完1棵之后,过100ms再切下一棵。NO,其实是不管你这棵切完没有,它都是100ms之后,再扔一棵白菜给你。你切完OK,没切完?二棵大白菜一块剁吧。。你想想,这不要命么,乱了套了。

所以setInterval和setTimeout,使用它们的时候,给个变量,用完就删除,一了百了最好了。

就这样,

var iID=setInterval(fn, 500);

//执行一堆事之后

clearInterval(iID);//清除

你如果想知道,setInterval和setTimeout一块用了会怎么样?

JS会说,我先遇上哪个就先干哪个。