理解Javascript_13_执行模型详解

下面是关于“理解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日

相关文章

  • 可以读取EXCEL文件的js代码第2/2页

    让我来为您详细讲解如何读取EXCEL文件的JS代码攻略。 一、安装依赖 要读取EXCEL文件,我们首先需要安装必要的依赖。请使用以下命令安装: npm install xlsx 二、导入模块 安装完依赖后,我们需要在JS文件中导入xlsx模块,以便使用其中的操作函数。请使用以下代码导入: const XLSX = require("xlsx&quo…

    JavaScript 2023年5月27日
    00
  • jQuery 表单验证插件formValidation实现个性化错误提示

    通过引入jQuery表单验证插件formValidation,我们可以在项目中轻松实现表单验证功能,并且可以根据个人需求进行自定制的错误提示。下面是实现该功能的完整攻略: 设置和引入jQuery表单验证插件formValidation 首先需要将jQuery库和formValidation文件引入到项目中,代码如下: <link rel="s…

    JavaScript 2023年6月10日
    00
  • js中键盘事件实例简析

    js中键盘事件实例简析 键盘事件是Web开发中十分常用的事件之一,掌握了它的使用方法可以大大提高效率和用户体验。这篇文章将从以下两个方面介绍js中键盘事件的相关知识:键盘事件类型和键盘事件的应用 键盘事件类型 onKeyDown 键盘按下触发。按住不放会不断触发该事件。 onKeyPress 键盘按下并放开后触发。 onKeyUp 键盘放开后触发。和按下事件…

    JavaScript 2023年6月11日
    00
  • JS获取年月日时分秒的方法分析

    JS获取年月日时分秒的方法分析 概述 在JavaScript中,获取当前系统时间的年、月、日、时、分、秒等信息有多种方法,下面分别介绍这些方法。 Date对象 JavaScript的Date对象提供了获取当前系统时间的多种方法。可以通过以下几种方式获取当前时间: 方法一:传入当前时间戳 const date = new Date(时间戳); // 时间戳是一…

    JavaScript 2023年5月27日
    00
  • JS实现利用闭包判断Dom元素和滚动条的方向示例

    下面是“JS实现利用闭包判断Dom元素和滚动条的方向示例”的完整攻略。 什么是闭包? 在JavaScript中,当函数可以访问并操作其作用域之外的变量时,就产生了闭包。 在函数内部定义一个内部函数,在内部函数中访问了外部函数的变量时,就形成了一个闭包。这个内部函数可以访问到外部函数中定义的变量,即使外部函数已经执行结束,这些变量仍然继续存在。 闭包有助于隐藏…

    JavaScript 2023年6月10日
    00
  • 用javascript实现的不错的一款网页选项卡

    实现网页选项卡可以分为以下步骤: HTML结构 首先,在HTML文件中创建一个选项卡容器div,并在其中创建与选项卡对应的多个div,每个div代表一个选项卡卡片。还需要添加一个列表ul,每个列表项li对应一个选项卡。 <div class="tab-container"> <ul class="tab-nav…

    JavaScript 2023年6月10日
    00
  • 千万不要错过的JavaScript高效对比数组差异方法

    千万不要错过的JavaScript高效对比数组差异方法 在JavaScript编程中,我们常常需要对比两个数组之间的差异,找出其中共有和不同的部分。本文介绍了JavaScript中三种高效对比数组差异的方法,分别是使用ES5中Array的filter、ES6中的Set,以及lodash库中的difference方法。 1. 使用Array的filter方法 …

    JavaScript 2023年5月28日
    00
  • React组件通信浅析

    React组件通信是React应用中非常重要的一部分。由于React应用的构建主要是通过组件开发来完成的,所以组件之间的通信非常重要。这篇文章将详细介绍React组件通信的方式。 组件通信的基本概念 React组件可以分为两种类型:父组件和子组件。父组件可以使用props将数据传递给子组件,子组件可以通过调用传递的方法来通知父组件。这是React组件之间通信…

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