单线程

首先js是单线程,任务队列采用“先进先出”,因此前面的任务不执行完,后面的任务是无法执行的,会造成阻塞。

setTimeout函数

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

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

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

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,也要排到后面。

最后需要说的一点就是,setTimeout函数用的是eval()函数,如果传入字符串,会被解析为函数语句执行,但是这存在一定的风险,所以setTimeout最好是传入函数,而不是字符串。


geology
176 声望6 粉丝

自学前端