浅谈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实现窗口抖动效果
Jan 03 Javascript
js实现纯前端的图片预览
Apr 27 Javascript
微信小程序 引用其他js文件实现代码
Feb 22 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
详解vue项目中如何引入全局sass/less变量、function、mixin
Jun 02 Javascript
Angular中sweetalert弹框的基本使用教程
Jul 22 Javascript
微信小程序入门之广告条实现方法示例
Dec 05 Javascript
详解微信小程序调用支付接口支付
Apr 28 Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 Javascript
Angular单元测试之事件触发的实现
Jan 20 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
Sep 21 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
一个数据采集类
2007/02/14 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python+Opencv识别两张相似图片
2020/03/23 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
外贸学院会计专业应届生求职信
2013/11/14 职场文书
英文简历中的自荐信范文
2013/12/14 职场文书
创意活动策划书
2014/01/15 职场文书
法人授权委托书范本
2014/04/04 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
判断Python中的Nonetype类型
2021/05/25 Python