autojs之定时器-setInterval()/setTimeout()

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()

仔细理解:

代码 运行结果 解释

autojs之定时器-setInterval()/setTimeout()_第1张图片autojs之定时器-setInterval()/setTimeout()_第2张图片autojs之定时器-setInterval()/setTimeout()_第3张图片


autojs之定时器-setInterval()/setTimeout()_第4张图片autojs之定时器-setInterval()/setTimeout()_第5张图片autojs之定时器-setInterval()/setTimeout()_第6张图片


autojs之定时器-setInterval()/setTimeout()_第7张图片autojs之定时器-setInterval()/setTimeout()_第8张图片autojs之定时器-setInterval()/setTimeout()_第9张图片


autojs之定时器-setInterval()/setTimeout()_第10张图片autojs之定时器-setInterval()/setTimeout()_第11张图片autojs之定时器-setInterval()/setTimeout()_第12张图片

定时器就是这么个东西,可以自己多运行运行看看

就是从上往下按顺序运行,
开启定时器是将定时器的回调函数加入主进程队列,
只有主进程运行完,才运行定时器回调函数

如果对你有帮助的话,不妨动动小手点个赞吧,三连也行哦

你可能感兴趣的:(#,Autojs,js,javascript)