从宏观上看,for和forEach都是循环类
而setTimeOut是定时器,类似于setInterval
下面我来细分一下这三者的内部区分原理,及相像点
for循环
分析以下代码
其async … await 是等待请求,类似ajax,顺着语句顺序执行,等待有await的语句请求完,
for循环是同步的,必须一步一步执行,不请求完数据,就不会执行下一步。
根据代码我们可以看出执行结果是左侧的:1,2,0。因为for循环中有async请求,所以当遇到await,在for循环中,判断i小于3,要等请求完成后才能打印i=1,实现i++继续循环继续请求,i<3,请求完成后再打印i=2, i++。此时i=3,i不小于3。这个时候循环结束,执行循环体外的语句,打印0
故打印结果是1,2,0
forEach循环
分析以下代码
forEach()支持异步,不支持等待,就是当循环体内遇到异步请求的时候,每循环一次,判断是否是异步请求,如果是则会开辟一个新队列,把异步的请求放进队列中,等循环结束后,执行循环体外的语句,执行循环体外的语句后,在执行队列中的语句
老样子,list的长度是3,list.forEach()所以需要循环3次,因为循环体中有异步请求,所以先开辟一个新队列,再将async修饰的循环体放入队列中。因为循环三次,所以存放三次循环体。执行完循环体后,再执行循环体外的语句,打印2,打印完之后,在执行队列中的语句,请求数据,打印1.一共执行三次。故打印结果是 2,1,,1,1
要注意的是:foreach中的await要加载请求中,才会开辟新队列,如果不是加载请求上,比如加在console.log(1)前,则不会开辟新队列,(如下)
setTimeOut()
setTimeOut()内部存在os异步系统,所以该方法本身就是异步的,故原理和forEach循环是一样的,即使设置的延时是0,打印结果也不变上截图!