for循环、forEach以及setTimeOut的内部原理区分

从宏观上看,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,打印结果也不变上截图!
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值