由script标签引发了我对setTimeout异步的思考

我们都知道在JS中setTimeout是异步执行机制的

像setTimeout(function(){},0)这样

如果在这条语句后面还有很多的同步任务,
它必须要等这些同步任务完成才会执行setTimeout里面的内容

setTimeout(function(){
    不好意思,我要等for循环的同步任务完成才能执行
},0)
for(var i = 0; i < 99999999999; i++){
    这里的任务完成了,才会执行setTimeout的内容
}

那么我所发现的这个问题如下:
如代码所示:在body中插入两个script标签
<body>

<script>
    alert('fir-script');
    setTimeout(()=>{
        alert('setTime');
    },0);
</script>
<script>
    alert('sec-script');
    var str = '测试的字符串';
    alert(str);
</script>

</body>

这里所用的测试字符串是中文
这里需要做3个实验,分为A、B、C

实验A:用比较短的字符串,(有5个中文字体)来测试,执行的弹窗结果是:
fir-script -> sec-script -> '测试字符串' -> setTime

实验B:用较长的字符串,(有45000个中文字体)来测试,结果发现了变化 执行的弹窗结果是:
fir-script ->setTime -> sec-script -> '测试字符串'

实验C:减少部分字符串,(有43000个中文字体)来测试,执行的弹窗结果是:
fir-script -> sec-script -> '测试字符串' -> setTime

在其他条件没有变化的情况下(注意:三次测试setTiemout的时间都是0)
程序执行的顺序似乎和字符串的长度有关
(那其实可以说是和script里面的内容大小有关,那也可以进一步理解为和解析script内容的时间有关)

为了验证上述结论(执行顺序和解析script内容的时间有关)
在实验B的基础上,对setTiemout的时间进行更改,其他保持不变
如B(5)为5ms后执行,即setTimeout(()=>{alert('setTime');},5);
下面我们看一下结果:

B(0): fir-script -> setTime -> sec-script -> '测试字符串'
B(5): fir-script -> setTime -> sec-script -> '测试字符串'
B(10): fir-script ->sec-script -> '测试字符串' -> setTime
B(15): fir-script -> sec-script ->'测试字符串' -> setTime

从上面几个实验我们可以在侧面看出一个现象
setTime 不会出现在 sec-script 和 '测试字符串' 之间
这也反映了JS是单线程执行的,而且在同步任务里,不受其他script标签的影响

通过这个案例,发现了一些问题,总结如下:

如有其他外部脚本(即使这些脚本都是同步任务),像setTiemout这些异步任务,不会等待所有同步任务执行完成
只有在同一个script标签里,异步任务要等待该标签的所有同步任务完成才会执行
因为需要去解析脚本,而解析脚本与执行另外的脚本不冲突

最后的最后,如果你在尝试过程中发现与本文的结果不相同,请把测试用的案例”加强“,如把字符串加到10W,这是因为setTimeout的不确定性
欢迎大家一起来探讨

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值