浅谈JavaScript 的执行顺序


Posted in Javascript onAugust 07, 2015

虽然现代浏览器可以并行的下载JavaScript(部分浏览器),但考虑到JavaScript的依赖关系,他们的执行依然是按照引入顺序进行的。

本文章记录本人在学习 JavaScript 中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。

在 html 文档中的执行顺序

js代码执行顺序比较的形象,用户可以直观的感受这种执行顺序。但是,js代码的执行顺序是比较复杂的。有时候我们会把js代码写在html里面,而html文档在浏览器中解析的过程是这样:浏览器按照文档流从上到下逐步解析页面结构和信息。js代码作为嵌入的脚本也算做html文档的组成部分,因此,js代码在装载时的执行顺序也是根据脚本标签<script>的出现来顺序来决定。(下面一个栗子)

<!DOCTYPE html>
<script>
  console.log("顶部脚本");
</script>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script>
    console.log("头部脚本");
  </script>
</head>
<body>
  <script>
    console.log("页面脚本");
  </script>
</body>
</html>
<script>
  console.log("底部脚本");
</script>

还有对于通过脚本标签<script>的src属性导入的外部js文件脚本,它也将按照其语句出现的顺序来执行,而且执行过程是文档装载的一部分,不会因为是外部js文件而延期执行。

// 先加载 b.js 并且执行里面的代码
<script src="b.js"></script>
// 然后在按顺序执行下面的代码
<script>
  console.log(1);
</script>

预编译

当js引擎解析的时候,它会在预编译对所有声明的变量和函数进行处理。

变量提升

console.log(a); // undefined
var a = 1;
console.log(a); // 1

预解析函数

f(); // 1
function f() {
  console.log(1);
};

详细:javascript变量声明提升(hoisting)

分块执行代码

js是按块执行代码的,所谓代码块就是使用<script>标签分隔的代码段。(下面一个栗子)

<script>
  // 代码段1
  var a = 1;
</script>
<script>
  // 代码段2
  function f() {
    console.log(1);
  };
</script>

因为js是按代码块来执行的。浏览器在解析html文档流的时候,如果遇到一个<script>标签,则js会等到这个代码块都加载完之后再对代码进行预编译,然后在执行。执行完毕后,浏览器会继续解析西门的html文档流,同时js也准备好处理下一个代码块。

有个小坑,由于js是按块执行的,因此在一个js块中调用后面块声明的变量或者函数就会提示语法错误。但是不同块都属于一个全局作用域,也就是说,块之间的变量和函数是可以共享的。(下面一个栗子)

<script>
  // 代码段1
  console.log(a);
  f();
</script>
<script>
  // 代码段2
  var a = 1;
  function f() {
    console.log(1);
  };
</script>

由于js是按块处理代码,同时又遵循html文档流的解析顺序,因此在上面的栗子中会看到语法错误。但是,在文档流加载完毕后再次访问就不会出现这种错误了。(下面一个栗子)

<script>
  window.onload = function(){ // 页面初始化事件处理函数
    // 代码段1
    console.log(a);
    f();
  }
</script>
<script>
  // 代码段2
  var a = 1;
  function f() {
    console.log(1);
  };
</script>

还有为了安全起见,一般在页面初始化完毕之后才允许js代码执行,这样就可以避免一些网速对js执行的影响。同时,也避开了html文档流对js执行的限制。

综上所述,javascript在执行时的步骤是:

1、先读入第一段代码块

2、对代码块进行语法分析,如果出现语法错误,直接执行第5步骤

3、对var变量和function定义的函数进行“预编译处理”(赋值式函数是不会进行预编译处理的)

4、执行代码块,有错则报错

5、如果还有下一段代码块,则读入下一段代码块,重复步骤2

6、结束

Javascript 相关文章推荐
JavaScript Date对象 日期获取函数
Dec 19 Javascript
javascript简易缓动插件(源码打包)
Feb 16 Javascript
使用js写的一个简易的投票
Nov 27 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Sep 26 Javascript
javascript实现模拟时钟的方法
May 13 Javascript
JavaScript电子时钟倒计时第二款
Jan 10 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 Javascript
JavaScript核心语法总结(推荐)
Jun 02 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
javascript封装 Cookie 应用接口
Aug 07 #Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
Aug 07 #Javascript
jQuery与getJson结合的用法实例
Aug 07 #Javascript
《JavaScript函数式编程》读后感
Aug 07 #Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
Aug 07 #Javascript
jquery实现先淡出再折叠收起的动画效果
Aug 07 #Javascript
C++中的string类的用法小结
Aug 07 #Javascript
You might like
PHP分页显示制作详细讲解
2008/11/19 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
对python中的装包与解包实例详解
2019/08/24 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
SQL面试题
2013/12/09 面试题
简述安装Slackware Linux系统的过程
2012/05/08 面试题
化学相关工作求职信
2013/10/02 职场文书
大学新生军训个人的自我评价
2013/10/03 职场文书
办公室助理岗位职责
2013/12/25 职场文书
大型会议接待方案
2014/03/01 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
新文化运动的基本口号
2014/06/21 职场文书
公司承诺函范文
2015/01/21 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS
virtualenv隔离Python环境的问题解析
2022/06/21 Python