高性能的javascript之加载顺序与执行原理篇

加载顺序

JavaScript 的加载顺序在浏览器中是从上到下、从左到右的,也就是按照 HTML 文档中<script>标签的出现的顺序进行逐个加载和执行。此外,当遇到<script>标签中的deferasync属性时,也会影响 JavaScript 脚本的加载与执行顺序。

  • defer:表示该脚本在 HTML 文档中的其他元素加载完毕之后再进行加载,也就是等到整个页面被浏览器解析完毕之后才会执行。该属性只对外部脚本文件有效,内部脚本无效。多个带有defer属性的脚本按照在 HTML 文档中出现的顺序进行加载和执行。
  • async:表示该脚本是异步加载的,也就是在 HTML 文档解析过程中不会对其他元素的加载和解析进行阻塞。当该脚本加载完成之后,会立刻被执行,不保证按照在 HTML 文档中的顺序来执行。多个带有async属性的脚本也不保证按照在 HTML 文档中出现的顺序进行加载和执行。

在实际开发中,我们应该根据页面的实际情况,遵循以下原则来进行 JavaScript 脚本的加载:

  • 通常将脚本文件的<script>标签放在页面</body>标签前,可以避免阻塞页面的渲染,提高页面的加载速度;
  • 尽可能使脚本文件较小,减少加载时间;
  • 对于不影响页面渲染或交互的功能,可以采用异步加载的方式,提高页面响应速度和交互体验;
  • 对于同时需要执行的多个 JavaScript 脚本文件,可以将它们合并为一个较大的文件,减少 HTTP 请求次数,提高页面加载速度。

执行原理

JavaScript 代码的执行过程分为两个阶段:解析阶段和执行阶段。

  • 解析阶段:该阶段主要完成的工作是将代码转换成抽象语法树(AST),即将代码解析成可执行的指令序列。在解析阶段中,JavaScript 引擎负责对变量、函数声明等进行预处理,将其进行存储,以供之后的执行阶段调用。同时在解析阶段中,也会对脚本文件进行语法检查,确保代码的正确性。

  • 执行阶段:该阶段主要完成的工作是按照解析阶段生成的指令序列进行逐条执行,并生成最终的运行结果。在执行阶段中,JavaScript 引擎会从函数调用栈(call stack)中获取下一条指令并执行,同时还会通过作用域链(scope chain)等内部机制进行变量访问和函数调用等操作。

在实际开发中,我们需要优化 JavaScript 代码的执行效率,可以采用以下方式:

  • 减少全局变量的使用,避免变量名和函数名的重复,以提高变量和函数的查找速度;
  • 将多次使用的变量和函数进行缓存,避免重复计算和查找;
  • 避免在 JavaScript 循环中频繁地操作 DOM 元素,避免页面的重绘,以提高页面渲染效率;
  • 对于与用户交互相关的 JavaScript 代码,可以采用事件委托(event delegation)的方式来减少 DOM 操作次数,提高页面响应速度和交互体验。

示例一:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>defer示例</title>
  </head>
  <body>
    <script src="a.js" defer></script>
    <script src="b.js" defer></script>
  </body>
</html>

在上述代码中,分别引入了a.jsb.js文件,并设置了defer属性。由于在 HTML 文档中出现的顺序是a.jsb.js,因此这两个文件会按照这个顺序分别进行异步加载。当 HTML 文档加载完成之后,这两个文件的执行顺序是先执行a.js,再执行b.js

示例二:

// 定义一个全局变量
var COUNT = 0;

// 循环一亿次计算全局变量COUNT的值
for (var i = 0; i < 100000000; i++) {
  COUNT++;
}

console.log(COUNT);

上述代码中,定义了一个名为COUNT的全局变量,并使用循环计算COUNT的值。在循环中,每次对COUNT进行自增操作,会对全局作用域链进行访问和修改,因此会较慢。如果需要优化执行效率,可以采用将COUNT变量进行缓存的方式,减少对全局作用域链的访问次数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:高性能的javascript之加载顺序与执行原理篇 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript 正则表达式解析

    JavaScript 正则表达式是一种用于模式匹配的功能强大工具。正则表达式由一个或多个字符组成,用于描述文本中的模式并执行匹配操作。本文将为你提供一份完整攻略,以帮助你更深入了解 JavaScript 正则表达式。 什么是正则表达式 正则表达式是一种描述文本模式的语言。它们可以用于搜索、替换和验证字符串。在 JavaScript 中,正则表达式是一种对象类…

    JavaScript 2023年5月28日
    00
  • wavesurfer.js绘制音频波形图的实现

    下面是“wavesurfer.js绘制音频波形图的实现”的完整攻略。 1. 介绍 Wavesurfer.js是一款用于在浏览器端绘制音频波形图的JavaScript库。它支持多种音频格式,包括MP3、Ogg、WAV等。由于它易于使用且支持丰富的交互功能,因此它非常适合用于音频播放器和音乐网站等场景中。 2. 安装 你可以通过如下方式安装Wavesurfer.…

    JavaScript 2023年6月11日
    00
  • 基于Two.js实现星球环绕动画效果的示例

    以下是 “基于Two.js实现星球环绕动画效果的示例”的完整攻略: 1. Two.js简介 Two.js是一款轻量级的渲染工具库,可以轻松使用它来创建2d图形和动画。 2. 创建场景和画布 这个示例的第一步是使用Two.js创建一个场景和画布。 // 创建画布 var two = new Two({ fullscreen: true, autostart: …

    JavaScript 2023年6月11日
    00
  • js给对象动态添加、设置、删除属性名与属性值实例代码

    让我们来详细讲解“js给对象动态添加、设置、删除属性名与属性值实例代码”的完整攻略。 添加属性名与属性值 我们可以使用点号(.)或者方括号[]的方式来向对象动态添加属性名和属性值。 点号添加 点号添加属性名和属性值的方式简单易懂,只需要在对象名后面接一个点号,再加上新的属性名,然后设置属性值即可。如下面这个例子: let obj = { name: &quo…

    JavaScript 2023年5月27日
    00
  • JavaScript 正则表达式详解

    JavaScript 正则表达式详解 什么是正则表达式 正则表达式(Regular Expression)是一种用来描述、匹配一系列符合某个规律的字符串的表达式。在许多编程语言中,如JavaScript、Python、Java等,都支持正则表达式。 在JavaScript中,我们可以使用RegExp对象来创建正则表达式,并通过match、test等方法进行匹…

    JavaScript 2023年5月19日
    00
  • js设置cookie过期当前时间减去一秒相当于立即过期

    设置Cookie的过期时间可以通过在Cookie中添加一个用于标识过期时间的Expires属性来实现。通常情况下,Expires属性的值可以是时间戳,表示Cookie的过期时间是基于指定的时间来计算。但如果我们需要相对于当前时间来设置Cookie的过期时间,那么就需要进行一些计算。 具体实现方法是:将当前时间的时间戳减去1秒的时间戳,然后将其转换为UTC格式…

    JavaScript 2023年5月27日
    00
  • 禁用backspace网页回退功能的实现代码

    为了禁用backspace网页回退功能,我们需要利用JavaScript来实现。以下是实现的步骤说明: 步骤一:绑定keydown事件 我们需要绑定keydown事件,以便监听用户的按键行为。在此事件内,我们可以获取用户按下的键码,并判断是否为backspace键。 window.addEventListener(‘keydown’, function(e)…

    JavaScript 2023年6月10日
    00
  • 学习javascript面向对象 理解javascript对象

    学习 JavaScript 面向对象编程(OOP)是成为一名 JavaScript 开发者的重要一步。理解 JavaScript 对象是理解 OOP 的基础。以下是学习 JavaScript 面向对象编程并理解 JavaScript 对象的完整攻略: 1. 了解面向对象编程 面向对象编程是将程序分解成一系列相互关联的对象。对象具有属性和方法,可以相互通信和交…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部