理解Javascript_13_执行模型详解

yizhihongxing

下面是关于“理解Javascript_13_执行模型详解”的完整攻略。

1. 理解Javascript执行模型

1.1 什么是执行模型

JavaScript 执行模型是指描述 JavaScript 引擎如何解析和执行 JavaScript 代码的一种方式。简单来说,就是 JavaScript 程序在浏览器中如何被“翻译”成机器能够理解的指令,然后顺序地被执行。

1.2 Javascript的执行顺序

JavaScript 采用单线程执行模型,同一时刻只能执行一个任务,任务按照队列的方式来一次一个地执行。JavaScript 是一门解释型语言。当执行一段 JavaScript 代码时,会按照以下顺序进行解析和执行:

  1. JavaScript 引擎首先会进行词法分析,将输入的代码文本拆成单个的词法单元。
  2. 语法分析器会对拆分出来的词法单元进行解析,将语言结构转换为抽象语法树(AST)。
  3. 解释器会逐行执行抽象语法树。在执行代码的过程中,如果需要执行函数,则先执行函数中的所有代码,然后再返回到调用函数的位置。

1.3 执行上下文

执行上下文是 JavaScript 中非常重要的概念之一,在 JavaScript 程序执行时一直存在。执行上下文可以理解为当前代码被执行时的运行环境。每当 JavaScript 引擎需要执行一段代码时,都会创建一个对应的执行上下文。

JavaScript 的运行环境包括全局执行上下文和函数执行上下文两种情况。全局执行上下文只有一个,由 JavaScript 引擎在页面刷新时自动创建。函数执行上下文在函数被调用时创建,可以有多个。每个执行上下文的生命周期包含三个阶段:创建阶段、执行阶段和销毁阶段。

在创建阶段,JavaScript 引擎会执行以下步骤:

  1. 创建变量对象:包括函数的所有形参、函数声明、变量声明等。
  2. 创建作用域链:包括当前函数的作用域和包含该函数的任何父函数的作用域。
  3. 确定this指向:在函数被调用时根据调用方式来确定this的值。

1.4 Javascript运行位子

在 JavaScript 中,引擎对代码的解析和执行是在两个位置分别进行的。解析阶段由 JavaScript 引擎的编译器负责,执行阶段由 JavaScript 引擎的解释器和执行器负责。

2. 示例说明

2.1 示例一

function func() {
  console.log('First');
  setTimeout(() => console.log('Second'), 0);
  console.log('Third');
}

func();

上面这段代码中,我们调用了一个名为func的函数。其中的代码包含了一个 setTimeout 函数,该函数是一个异步函数,会在 0 秒之后将参数传给回调函数并将其推入消息队列中。因此在执行的过程中,setTimeout 是在等待一段时间之后才执行回调函数,并且在执行其它代码的同时异步地运行。

当我们执行 func() 函数的时候,JavaScript 引擎首先会在全局作用域中创建变量对象和作用域链。在创建 func 的执行上下文时,JavaScript 引擎会首先在函数作用域中创建变量对象,其中包括函数的参数 arguments 和函数声明 func。然后在作用域链上添加外部环境的变量对象。接着,JavaScript 引擎会逐行执行函数中的代码,并将 setTimeout 函数的回调函数添加到消息队列中。最终输出FirstThirdSecond

2.2 示例二

var flag = false;

setTimeout(() => flag = true, 0);

while (!flag) {}

console.log('done');

上面这段代码包含了一个变量flag,在 setTimeout 函数中设置flag的值为 true,然后 0 秒之后将函数添加到消息队列中。紧接着是一个 while 循环,只要flag的值为 false,该循环会一直执行下去,从而阻塞消息队列的处理。在 while 循环结束后,代码会输出done

在该代码的执行过程中,我们会发现setTimeout函数的回调函数一直没有执行。这是因为 while 循环阻塞了消息队列的处理,导致消息队列中的函数不能被执行。在这种情况下,我们可以采用setTimeout与Promise的配合使用来避免循环阻塞。

var flag = false;

new Promise(resolve => {
  setTimeout(() => {
    flag = true;
    resolve();
  }, 0);
}).then(() => console.log('done'));

上面这段代码使用 Promise 对setTimeout函数的回调函数进行了包装,因此在setTimeout的回调函数执行完成之后才会输出done。这种写法可以避免循环阻塞。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:理解Javascript_13_执行模型详解 - Python技术站

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

相关文章

  • 浅谈Vue使用Elementui修改默认的最快方法

    下面我来详细讲解如何使用Element UI修改Vue的默认主题样式。 安装 Element UI 首先需要安装Element UI,可以通过npm安装: npm install element-ui -S 引入 Element UI 在Vue项目的main.js文件中,引入Element UI的样式文件和js文件: import Vue from ‘vue…

    JavaScript 2023年6月10日
    00
  • js chrome浏览器判断代码

    针对“js chrome浏览器判断代码”的完整攻略,以下是一份详细的解释: 1. 为什么需要JavaScript判断浏览器? 在Web开发中,不同的浏览器可能会对同样的代码产生不同的结果,甚至可能会造成部分功能无法使用,因此在开发过程中,我们需要根据用户所使用的浏览器类型进行代码适配,确保在不同的浏览器下都有良好的用户体验。而JavaScript作为一种运行…

    JavaScript 2023年6月11日
    00
  • js合并两个数组生成合并后的key:value数组

    要完成在JavaScript中合并两个数组生成键值对数组的任务,请按照以下步骤进行: 定义两个数组,作为操作对象。 javascript const keys = [‘name’, ‘age’, ‘gender’]; const values = [‘John’, 25, ‘male’]; 定义一个空数组,用于存储合并后的键值对数组。 javascript …

    JavaScript 2023年5月28日
    00
  • 一文带你搞懂JavaScript中转义字符的使用

    一文带你搞懂JavaScript中转义字符的使用 在JavaScript中,转义字符是指以反斜线 “\” 开头的字符,用于表示在字符串中无法直接输入的内容,比如双引号,单引号,换行符等。下面我们来详细讲解JavaScript中转义字符的使用。 转义字符的使用 使用转义字符时,需要将反斜线和需要转义的字符组合使用。下面是一些常见的转义字符及其含义: 转义字符 …

    JavaScript 2023年5月20日
    00
  • js删除数组元素、清空数组的简单方法(必看)

    JavaScript删除数组元素和清空数组的简单方法 在JavaScript中,删除数组元素和清空数组的操作并不像其他编程语言那样简单。不过,在掌握了一些技巧和方法后,我们就能够轻松实现这些操作了。 删除数组元素 splice方法 JavaScript提供了splice()方法,该方法可以用于删除数组元素。 array.splice(start, delet…

    JavaScript 2023年5月27日
    00
  • JavaScript进阶之前端文件上传和下载示例详解

    JavaScript进阶之前端文件上传和下载示例详解 本文将详细讲解前端文件上传和下载的过程和实现方法,包括如何使用HTML5 FormData API、AJAX和原生JavaScript来完成文件上传和下载功能的开发。 文件上传 文件上传是我们日常开发中常用的功能之一。下面我们通过两个示例来讲解文件上传的实现。 示例1:上传图片并预览 HTML部分 &lt…

    JavaScript 2023年5月27日
    00
  • SWFObject基本用法实例分析

    那么针对“SWFObject基本用法实例分析”的攻略,我会从以下几个方面着手进行详细讲解: SWFObject基本介绍 SWFObject的引入 SWFObject的基本用法 实例分析 结束语 接下来会一步步讲解,希望对您有所帮助。 1. SWFObject基本介绍 SWFObject是一个用于嵌入Flash对象的JavaScript库,使用SWFObjec…

    JavaScript 2023年6月11日
    00
  • JavaScript实现打砖块游戏

    JavaScript实现打砖块游戏攻略 简介 打砖块游戏是一款非常经典的小游戏,它的核心玩法是玩家要逐一击碎各种形状的砖块,来获得游戏分数。在该游戏中,玩家需要使用挡板控制小球反弹,击打并攻破砖块,从而通过每一关的挑战,最终完成游戏。 下面,我们将介绍如何使用JavaScript来实现打砖块游戏。 HTML和CSS搭建基础页面 在实现打砖块游戏之前,我们首先…

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