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

查看:136
本文介绍了javascript - 当<script>元素没有async和defer属性时,JS脚本是如何执行的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

红皮书原文

无论如何包含代码,只要不存在defer和async属性,浏览器都会按照<script">元素在页面中出现的先后顺序对它们依次进行解析。换句话说,在第一个<script>元素包含的代码解析完成后,第二个<script>包含的代码才会被解析,然后才是第三个、第四个……

这里的解析是指运行,还是啥。
而且,不论是内嵌还是外部引用,都会进入阻塞执行的状态?换句话说,在解析出第一个<script>元素中的脚本内容时(不管它是内嵌还是外部js文件),在执行这些js代码时,浏览器无法再解析或执行其他的页面内容和JS代码?这是我的理解,不知是否正确。

其实这个问题涉及到一些术语的理解问题。
什么下载、加载、解析、运行、渲染,这些词在不同的资料中常常混用,所以经常让人不能理解。

解决方案

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,数据结构,编译原理,操作系统。

这篇关于javascript - 当&lt;script&gt;元素没有async和defer属性时,JS脚本是如何执行的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆