1.两种常用定时器
循环执行:
设置定时器【setInterval()】清除定时器【clearInterval()】
单次执行:
设置定时器【setTimeout()】清除定时器【clearTimeout()】
2.内存中只能有一个定时器,使用完定时器后要清除
(这个之前不知道在哪看到的,但是好像可以设置多个定时器)
3.定时器是单线程的(我觉得只要理解这个单线程的含义,定时器也就没什么难的了)
setTimeout(fn, x)表示延迟x毫秒之后执行fn,延迟的时间严格来说总是大于x毫秒的,至于大多少,就要看当时JavaScript的执行情况了。
另外,如果多个定时器没有及时清除,就会存在干扰,总之,及时清除已经不需要的定时器是一个好的习惯。
setTimeout注册的函数fn会交给浏览器的定时模块来处理,延迟时间到了就会添加fn这个回调函数到主进程队列当中,但是如果主进程队列前面刚好还有正在执行的没有执行完的代码,则又要花费一定的时间去等待主进程,然后再执行fn,所以实际的时间往往是更长的。
引自JavaScript定时器与执行机制,看不懂没关系,我也看不太懂,先入门再深究
以下是个人理解:
代码是顺序运行的,运行到定时器行,开启定时器;
然后继续往下运行,若遇到其他语句或者循环或者sleep或者exit,定时器到时间也要在它们之后才能运行;
我想应该大部分情况下都是在多线程里用定时器吧,这样可以避免上述情况。
以下代码包括循环定时器、单次定时器、清除循环定时器、多个定时器、其他、循环、exit等部分,感觉比较典型了,根据控制变量法,分别注释不同部分,看运行结果是否符合猜想
/*循环定时器1*/
var id1 = setInterval(function(){ //循环定时器id
log("id1");
}, 2000);
/*循环定时器2*/
var id2 = setInterval(function(){ //可以设置多个定时器
log("id2");
}, 2000);
//30s后取消循环
setTimeout(function(){ //单次定时器
clearInterval(id1); //清除循环定时器id1
}, 30*1000);
/*其他*/
sleep(3000)
log("我是第一");
/*循环*/
for(i=0;i<5;i++){
log(i);
sleep(3000)
}
/*退出*/
exit()
仔细理解:
代码 | 运行结果 | 解释 |
---|
定时器就是这么个东西,可以自己多运行运行看看
就是从上往下按顺序运行,
开启定时器是将定时器的回调函数加入主进程队列,
只有主进程运行完,才运行定时器回调函数
如果对你有帮助的话,不妨动动小手点个赞吧,三连也行哦