对JS中settimeout的一些认识

单线程

首先js是单线程,任务队列采用“先进先出”,所以前面的任务不执行完,后面的任务是没法执行的,会形成阻塞。函数

setTimeout函数

咱们都知道该函数接受两个参数,第一个参数为字符串或者函数,第二个为延迟的时间,单位为毫秒。之前我一直认为若是后面的参数为2000,那么两秒后该函数就会执行。可实际上并非这样。你应该这样理解,settimeout函数是在指定的延迟时间后,将该任务加入到js的任务队列中,具体执行的时间取决于任务队列中位于该任务前面全部任务的执行时间。线程

let a = 1;
settimeout(function(){
  console.log(1111);
},1000);
while(a>0){
 a++
}

以上代码永远也不会输出1111。1s后任务加入到任务队列,由于前面是死循环,永远也执行不完,因此后面的语句没法执行。若是延迟时间为0,会出现什么情况?code

setTimeout(function(){
  console.log(1111);
},0);
fun one();

即便延迟变为0,也是先执行fun one()函数,而后输出1111。队列

那么问题来了,在延迟为0的状况下,fun one()执行100遍,结果会是怎么样的?字符串

setTimeout(function(){
  console.log(1111);
},0);
fun one();
fun one();
fun one();
fun one();
...

无论后面有多少个函数,setTimeout里面的函数老是最后执行,即便延迟为0。有点奇怪,延迟参数设为0,也要排到后面。io

最后须要说的一点就是,setTimeout函数用的是eval()函数,若是传入字符串,会被解析为函数语句执行,可是这存在必定的风险,因此setTimeout最好是传入函数,而不是字符串。console

相关文章
相关标签/搜索