先看一段代码:

console.log('-',new Date().getTime())    for(let i = 0;i<100;i++){        setTimeout(function(){          console.log('exeute');          },100);    }    console.log('i',new Date().getTime())

执行后果:

- 1610778978900i 1610778978901100 exeute

看第一个log跟第二个log工夫只相差了1ms,工夫短到简直距离为0.

再看一段代码:

console.log('-',new Date().getTime())    for(let i = 0;i<100000;i++){        setTimeout(function(){          console.log('exeute');          },100);    }    console.log('i',new Date().getTime())

执行后果

- 1610779277393i 16107792783044466 exeute过一会再去看,期间程序始终在执行,电脑还差点卡死了...- 1610779277393i 161077927830413188 exeute不出意外的状况下,你会最终看见打印后果逐步减少到10万。法则感觉如下:一开始很快的增长到上千上万(简直是同时进行的)而后逐渐递增到10万。

第二段代码log工夫相差了911ms。
从eventLoop异步原理,先进先出,后进后出逻辑来看的确后果如咱们所愿。但为何在第一段代码里,咱们会同时看见打印了100次exeute呢?

log和工夫time的曲线仿佛出现如下:

在后面很短雷同的工夫里,同时打印excute,随后time逐步减少。
其实在A这个区块内,也是满足先进先出后进后出的逻辑的,一段近乎程度
的增长曲线(能够了解成前半部分,比方i取100个的时候,“简直”是同时log,这里无穷小的工夫能够了解成0,所以在A这个区域,咱们肉眼看见的先进先出没察看到

这里用到setTimeout的知识点:
1、待退出队列的音讯和一个工夫值(可选,默认为 0)。这个工夫值代表了音讯被理论退出到队列的最小延迟时间。如果队列中没有其它音讯并且栈为空,在这段延迟时间过来之后,音讯会被马上解决(能看肉眼看到的统一)。然而,如果有其它音讯,setTimeout 音讯必须期待其它音讯解决完(所以为何10万级for循环log的时候,咱们会源源不断的看见被打印)。因而第二个参数仅仅示意起码延迟时间,而非确切的等待时间