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

yizhihongxing

加载顺序

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日

相关文章

  • js中取得变量绝对值的方法

    当我们需要在 JavaScript 中获取一个变量的绝对值时,可以使用 Math 对象的 abs() 方法。下面是详细的攻略: 使用 Math.abs() 方法获取变量的绝对值 Math 对象是 JavaScript 提供的一个内置对象,通过该对象提供的 abs() 方法,即可获取任意数字类型的变量的绝对值。 let num1 = -5, num2 = 10…

    JavaScript 2023年5月28日
    00
  • javascript中eval解析JSON字符串

    JavaScript中的eval()函数可以将JSON格式的字符串解析为可操作的JavaScript对象,从而方便地在应用程序中使用。下面就是详细的攻略: 什么是JSON字符串? JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,用于存储和交换数据。它基于JavaScript语法,但具有更宽泛的应用范围,因为许多编程语言都支持它。 JSO…

    JavaScript 2023年5月27日
    00
  • JavaScript使用concat连接数组的方法

    下面是关于JavaScript使用concat()连接数组的详细攻略: 什么是concat()方法? concat()方法用于连接两个或多个数组,生成一个新的数组。语法如下: array.concat(array1, array2, …, arrayX) 其中,array 为原始数组,array1, array2, …, arrayX 为需要连接的数…

    JavaScript 2023年5月27日
    00
  • jsonp实现百度下拉框功能的方法分析

    下面是“jsonp实现百度下拉框功能的方法分析”的完整攻略,包含两条示例说明。 1. 什么是jsonp jsonp是JSON with Padding的缩写,是一种跨域数据访问的方法。通常情况下,由于浏览器同源策略的限制,我们无法通过ajax请求跨域的数据。但是可以通过动态添加<script>标签,来跨域获取数据。这就是jsonp的实现原理。 2…

    JavaScript 2023年5月27日
    00
  • javascript 小时:分钟的正则表达式

    首先,为了匹配符合“小时:分钟”格式的字符串,我们需要使用正则表达式。下面是一个简单的正则表达式: /^\d{1,2}:\d{1,2}$/ 这个正则表达式使用了^和$锚定符来确保整个字符串都与模式匹配。模式由两个数字组成,由一个冒号分隔。d{1, 2}表示可以匹配1-2位的数字。因此,模式可以匹配 1:30、10:45、21:00 等。 如果你需要限制小时必…

    JavaScript 2023年5月27日
    00
  • JavaScript验证Email(3种方法)

    JavaScript验证Email(3种方法) 什么是Email? Email又称电子邮件,是一种利用计算机网络提供的电子信箱来交换电子邮件(简称邮件)的通信方式。Email具有传输快捷、费用低廉、传递资料范围广泛、信息安全性好、随时随地都可以阅读等特点。 为什么需要验证Email? 在许多场合中,Email是身份验证、信息传递和通信的必要手段。但是,一些用…

    JavaScript 2023年5月19日
    00
  • JavaScript高级程序设计(第3版)学习笔记6 初识js对象

    JavaScript高级程序设计(第3版)学习笔记6 初识js对象 简介 本篇笔记主要介绍了JavaScript中对象的基本概念、属性和方法的使用,以及对象的创建与初始化方法等。 JavaScript对象 JavaScript是一种基于对象的语言,并且几乎所有的事物都被视为对象。对象是一组相关数据和方法的集合。 JavaScript对象分为两种类型:内建对象…

    JavaScript 2023年5月27日
    00
  • js实现复制功能(多种方法集合)

    JS实现复制功能(多种方法集合) 复制(Copy)功能指的是将一个文本或者图片等资源从一个位置通过“复制”的方式再次拷贝到另一个位置,被复制的资源不会在原位置上被删除或移动,只是将其拷贝到了新的位置,从而实现了重复利用资源的目的。 在Web前端开发中,复制功能也是很常见的一个需求,如点击时自动复制某段文本、在表单中粘贴内容等功能。本文将介绍几种实现复制功能的…

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