标签有defer和async属性,defer属性标注的脚本会被异步下载但是不会被执行,直到文档的载入和解析完成,并可以操作,脚本才会被执行。这个异步下载是js主线程做的,还是页面渲染的线程做的?
2 回答
慕勒3428872
TA贡献1848条经验 获得超6个赞
在浏览器中,JavaScript是单线程的,并且和UI渲染共用一个线程。加个引用更有说服力,出自于最新版《深入浅出Nodejs》48页第三句。我也看到有资料说,JavaScript线程和UI渲染都是浏览器线程,但因为它们互斥,所以只能串行。不知道那种说法是正确的。对于defer和anync的异步加载我也有疑惑,所以我查找到这个资料:HTML5提出了WebWorker,它会在当前JavaScript的执行主线程中利用Worker类新开辟一个额外的线程来加载和运行特定的JavaScript文件,这个新的线程和JavaScript的主线程之间并不会互相影响和阻塞执行。
鸿蒙传说
TA贡献1865条经验 获得超7个赞
1:JS引擎线程和UI[主]线程是互斥关系,而不是在同一个线程,具体可查询线程互斥的概念。很显然的,js引擎大部分都以虚拟机的概念存在,不大可能跟上层应用公用线程。(个人猜测)2:在任何一种面向用户的程序设计里面,I/O放在主线程同步都是一种无知的行为。场景假设:如果浏览器的网络资源请求线程都安排在主线程,那sry,你这张图片下载完成之前,浏览器是卡死的。很显然现代浏览器都不这么二,所以,网络请求应该不是在UI[主]线程。3:是HTML标准,在早期的时候,还有JScript,VBScript等,而它配备的配置(属性)是标准里面定义用来告诉浏览器怎么处理这个标签的。 defer和async属性都是告诉浏览器,这里面的内容你不要等待,你继续~;否则,浏览器默认情况是要等这里面的内容下载完成后转交给JS线程执行在继续往下解析。4:WebComponent5:可以了解下客户端的知识,不要局限于纯前端,你提这问题,稍微有点客户端领域的知识的话,不看任何资料都能猜出个大该。
添加回答
举报
0/150
提交
取消