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

当<script>元素没有async和defer属性时,JS脚本是如何执行的?

当<script>元素没有async和defer属性时,JS脚本是如何执行的?

幕布斯7119047 2018-11-29 22:18:04
红皮书原文无论如何包含代码,只要不存在defer和async属性,浏览器都会按照<script">元素在页面中出现的先后顺序对它们依次进行解析。换句话说,在第一个<script>元素包含的代码解析完成后,第二个<script>包含的代码才会被解析,然后才是第三个、第四个……这里的解析是指运行,还是啥。而且,不论是内嵌还是外部引用,都会进入阻塞执行的状态?换句话说,在解析出第一个<script>元素中的脚本内容时(不管它是内嵌还是外部js文件),在执行这些js代码时,浏览器无法再解析或执行其他的页面内容和JS代码?这是我的理解,不知是否正确。其实这个问题涉及到一些术语的理解问题。什么下载、加载、解析、运行、渲染,这些词在不同的资料中常常混用,所以经常让人不能理解。
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

1:script element
2:浏览器在解析html时,自顶而下的往下一步步解析HTML并生产DOM,在解析过程中,遇到内敛js则暂停解析,等js解析引擎解析完成后再往下解析,遇到具有src属性的时候则一句1所描述的方式去处理。

书中所描述的解析其实包括了执行的概念;

js引擎其实可以粗略的分为解析器执行器解析器是对语法词法进行分解,构造出 抽象语法树[AST],执行器则是根据AST来执行相对应的操作。(只是通俗易懂的这么解释,实际情况应该差不多)。

什么下载、加载、解析、运行、渲染:

下载:从远程服务器上获取编码字符,(比如:将a.js从源服务器上下载到本地)
加载:将字符载入容器,(比如:将a.js载入到js引擎)
解析:将输入的内容解析成想对容器可读的内容;(比如:a.js 被解析成了一个 AST)
执行:将输入AST根据设定执行并产出输出结果。
渲染:将输入的变成图像呈现在显示器中。

实际的设计非常复杂,一般是浏览器开发人员比较关注这些内容。

WebKit
v8
bebel

涉及知识点包括(但不限于): http,tcp,数据结构,编译原理,操作系统。


查看完整回答
反对 回复 2018-12-30
  • 1 回答
  • 0 关注
  • 464 浏览
慕课专栏
更多

添加回答

举报

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