setTimeout是单线程,可以说是一部但不完全是
setInterval则是循环定时,但是经过延时后一直在里面循环
在俩个定时器中
可以用clearTimeout(setTimeout()赋给值的变量);
和clearInterval(setInterval()赋给值的变量);
setTimeout定时器和setInterval定时器的嵌套使用及延时顺序
setTimeout(function(){
alert("hello");
setTimeout(function(){
alert("world");
},2000);
},2000);
无论是alert("hello");
在下一个setTimeout前后,到了2秒则率先执行,之后再等2秒 再是alert("world");
。但要注意的是只执行一次后,然后就没有然后了。
再来看看setInterval定时器:
setInterval(function(){
setTimeout(function(){
alert("hello");
setTimeout(function(){
alert("world");
},2000);
},2000);
},5000);
先是执行setInterval()函数,在那之前先停顿所写的5秒后再执行。之后等待2秒执行第一个setTimeout()里的语句。再等2秒执行第二个setTimeout()里的语句。但因为再setInterval()里所以循环执行语句。一直循环,请看最后的注意事项。
若是这样一段js呢?
setInterval(function(){
setTimeout(function(){
alert("hello");
},2000);
setTimeout(function(){
alert("world");
},2000);
},5000);
则出现的顺序是自下而上的,所以过五秒后setInterval()
里代码执行,再过俩秒一起执行俩个setTimeout()
里的代码,因自下而上执行顺序所以先执行第一个setTimeout()
再执行第二个setTimeout()
注意:修正一下:
JS:
setInterval(function(){
setTimeout(function(){
alert("hello");
setTimeout(function(){
alert("world");
},2000);
},2000);
},5000);
在执行的时候过5秒先是执行setInterval()
里的代码,过2秒再是执行setTimeout()
最后再过2秒执行第二个setTimeout()
这事正确的,但是。第二次循环就不是这样执行的。若你把alert()换成consloe.log(1);和setInterval(...,5);
的话第一次还是上所诉,一样,但是之后的循环(第二次,第三次。。。)的延时都是以setInterval(...,5)的之间为准,而且一个或多个一次性的setTimeout()的延时就没有用了
,所以之后控制台会乱跳1。