为了账号安全,请及时绑定邮箱和手机立即绑定

script标签的defer 问题?

script标签的defer 问题?

开心每一天1111 2019-05-25 14:20:27
标签有defer和async属性,defer属性标注的脚本会被异步下载但是不会被执行,直到文档的载入和解析完成,并可以操作,脚本才会被执行。这个异步下载是js主线程做的,还是页面渲染的线程做的?
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

在浏览器中,JavaScript是单线程的,并且和UI渲染共用一个线程。
加个引用更有说服力,出自于最新版《深入浅出Nodejs》48页第三句。我也看到有资料说,JavaScript线程和UI渲染都是浏览器线程,但因为它们互斥,所以只能串行。不知道那种说法是正确的。
对于defer和anync的异步加载我也有疑惑,所以我查找到这个资料:
HTML5提出了WebWorker,它会在当前JavaScript的执行主线程中利用Worker类新开辟一个额外的线程来加载和运行特定的JavaScript文件,这个新的线程和JavaScript的主线程之间并不会互相影响和阻塞执行。
                            
查看完整回答
反对 回复 2019-05-25
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

1:JS引擎线程和UI[主]线程是互斥关系,而不是在同一个线程,具体可查询线程互斥的概念。
很显然的,js引擎大部分都以虚拟机的概念存在,不大可能跟上层应用公用线程。(个人猜测)
2:在任何一种面向用户的程序设计里面,I/O放在主线程同步都是一种无知的行为。场景假设:
如果浏览器的网络资源请求线程都安排在主线程,那sry,你这张图片下载完成之前,浏览器是卡死的。很显然现代浏览器都不这么二,所以,网络请求应该不是在UI[主]线程。
3:是HTML标准,在早期的时候,还有JScript,VBScript等,而它配备的配置(属性)是标准里面定义用来告诉浏览器怎么处理这个标签的。
defer和async属性都是告诉浏览器,这里面的内容你不要等待,你继续~;否则,浏览器默认情况是要等这里面的内容下载完成后转交给JS线程执行在继续往下解析。
4:WebComponent
5:可以了解下客户端的知识,不要局限于纯前端,你提这问题,稍微有点客户端领域的知识的话,不看任何资料都能猜出个大该。
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 304 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信