高性能的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)
上一篇 3天前
下一篇 3天前

相关文章

  • ajax中get和post的说明及使用与区别

    AJAX中GET和POST的说明及使用与区别 1. GET和POST的说明 GET和POST是HTTP中两种最常见的请求方法,可以用于在Web服务器和客户端之间发送数据。在AJAX中远程访问服务器时,也可使用GET和POST请求。 GET请求:将请求参数以查询字符串的方式加在URL后面,以?开头,并用&连接多个参数。URL的长度有限制,一般不能超过2…

    JavaScript 2023年5月19日
    00
  • JavaScript 开发工具webstrom使用指南

    JavaScript 开发工具webstrom使用指南 概述 WebStorm是一款由JetBrains公司开发的JavaScript集成开发工具(IDE),全称是WebStorm: The Smartest JavaScript IDE,该工具为开发JavaScript应用程序提供了丰富的工具和功能,如语法高亮、智能代码完成功能、代码导航、调试、版本控制等…

    JavaScript 2023年5月19日
    00
  • js分页显示div的内容

    下面是我的分页显示div内容的攻略: 什么是分页显示div的内容 分页显示div的内容是指在一个较大的div中,将内容进行分页,并且通过一些交互方式,可以实现翻页、跳页等操作,从而更好地展示数据。 分页显示div的实现 分页显示div的实现可以通过JavaScript代码来实现,其中包含以下几个步骤: 计算分页 首先需要计算数据的分页情况,这可以通过获取数据…

    JavaScript 2天前
    00
  • 异步安全加载javascript文件的方法

    异步安全加载JavaScript文件是指在保证网页性能和用户体验的同时,确保JavaScript代码能够无误地执行。下面是异步安全加载JavaScript文件的方法: 1. 异步加载JavaScript文件 异步加载JavaScript文件可以使用HTML5中的script标签,并且设置async属性。这样浏览器会异步加载脚本,不会阻塞网页的渲染,同时脚本在…

    JavaScript 3天前
    00
  • 全面了解JS中的匿名函数

    全面了解JS中的匿名函数攻略 什么是匿名函数 匿名函数是指在JS中没有名字的函数表达式。它是一种快速定义函数的方式,通常用于一些比较复杂的函数场景,同时也可以用于模块化编程、事件绑定、回调函数等。 定义匿名函数 匿名函数可以用函数表达式的形式来定义。例如: let add = function (a, b) { return a + b; }; 在这个例子中…

    JavaScript 2天前
    00
  • 今天是星期几的4种JS代码写法

    下面我将详细讲解今天是星期几的4种JS代码写法。 方法一:使用Date对象 很多人可能都知道JS中有一个Date对象,它可以获取当前时间和日期的信息。利用它计算今天是星期几非常容易。 const today = new Date().getDay(); const weekdays = ["Sunday", "Monday&qu…

    JavaScript 2天前
    00
  • 通过js示例讲解时间复杂度与空间复杂度

    下面我将详细讲解“通过JS示例讲解时间复杂度和空间复杂度”的攻略。 什么是时间复杂度和空间复杂度 时间复杂度和空间复杂度都是算法评估的重要指标,分别表示了算法执行时间和所需内存空间的量度。 时间复杂度:指执行算法所需时间的数量级,常用大O表示法来表示。例如,O(1)表示执行时间常量,O(n)表示执行时间与数据规模成线性比例,O(n^2)表示有执行时间与数据规…

    JavaScript 2天前
    00
  • Javascript中的call()方法介绍

    Javascript中的call()方法介绍 什么是call()方法? call() 方法在调用一个函数时,可以指定函数内部的 this 关键字所指向的值。通过 call() 方法,我们可以通过一个已有的对象去调用另一个对象的方法。 call()方法的基本语法 fun.call(thisArg, arg1, arg2, …) call()方法参数说明 t…

    JavaScript 2天前
    00
  • .NET异步编程模式的三种类型介绍

    当今的软件开发需要在面对并发的任务时能够高效地处理数据和事件。异步编程模式是一种提高程序效率和性能的方式,尤其是针对I/O密集型的应用程序。在.NET平台上,异步编程模式被广泛使用,并且有多种实现方式,下面我们将介绍.NET异步编程模式的三种类型。 1. Async/Await模式 异步编程的目标是提高程序的效率,通过让程序在某个任务执行的同时可以执行其他任…

    JavaScript 1天前
    00
  • Javascript中的return作用及javascript return关键字用法详解

    当程序执行一个函数时,可能需要将函数的计算结果返回给调用函数的地方,这种情况下就需要使用return语句了。 在JavaScript中,return语句用于将函数执行结果返回给调用者。一旦return语句执行,函数将立即停止执行,并将return语句的值返回给调用者。如果没有指定返回值,函数将默认返回undefined。 return语句的语法格式 retu…

    JavaScript 2天前
    00