浅谈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 相关文章推荐
jQuery实现流动虚线框的方法
Jan 29 Javascript
jQuery的load()方法及其回调函数用法实例
Mar 25 Javascript
jQuery层动画定位滑动效果的方法
Apr 30 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
JQuery validate插件验证用户注册信息
May 11 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
node基于puppeteer模拟登录抓取页面的实现
May 09 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
Dec 06 Javascript
微信小程序实现带放大效果的轮播图
May 26 Javascript
vue webpack build资源相对路径的问题及解决方法
Jun 04 Javascript
elementui实现预览图片组件二次封装
Dec 29 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基础学习之变量的使用
2011/06/09 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
Python 实现简单的电话本功能
2015/08/09 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
语文教育专业推荐信范文
2013/11/25 职场文书
公益活动策划方案
2014/01/09 职场文书
工作交流会欢迎词
2014/01/12 职场文书
《雨点》教学反思
2014/02/12 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
教师节横幅标语
2014/10/08 职场文书
元旦晚会开场白
2015/05/29 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript