javascript执行上下文详解

JavaScript 执行上下文详解

JavaScript(以下简称 JS)是一种运行在浏览器中的编程语言,它常常被用来实现交互性和动画效果。理解 JavaScript 的执行上下文对于掌握 JS 编程至关重要,这篇文章将为你详细讲解 JS 执行上下文的工作原理及其相关的知识点。

JS 执行上下文

JS 执行上下文是在代码执行时,JavaScript 引擎所创建的一个内部数据结构,用于存储关于代码执行的所有信息。每当一个新的执行上下文被创建时,JS 引擎会对当前上下文进行压栈,即将其推到调用栈顶部。

执行上下文三要素

每个执行上下文由三个关键要素组成:

  1. 变量环境(Variable Environment)- 存储在当前执行上下文中声明的变量,同时也包含了函数声明等信息;
  2. 词法环境(Lexical Environment)- 保存了当前执行上下文中声明的所有符号(标识符)和它们对应的值(变量、函数)的映射。在函数的执行上下文中,它还记录了函数声明时的词法环境;
  3. this 值(This Binding) - 在执行上下文的创建阶段,JS 引擎会确定 this 的值,并将其绑定到执行上下文中。

执行上下文的类型

在 JavaScript 中,有三种类型的执行上下文:

  1. 全局执行上下文,它是 JS 引擎在代码执行的开头创建的第一个执行上下文,它的作用域为全局作用域。
  2. 函数执行上下文,每当函数被调用时,都会创建一个新的函数执行上下文,它的作用域为函数作用域。
  3. Eval 执行上下文,由 eval() 函数所创建,它的作用域依赖于调用 eval() 函数代码所处的执行上下文。

执行上下文创建阶段

当一个新的执行上下文被创建时,它将经历两个阶段的过程:创建阶段和执行阶段。

创建阶段

  1. 变量对象的创建: 变量对象(Variable Object)是一个关键的元素,用于在代码执行前存储变量、函数定义等信息。针对全局执行上下文,它是全局变量对象,包含了全局变量、函数,以及用let和const定义的变量。针对函数执行上下文,它是活动对象(Active Object),除了包含函数的参数和局部变量,还包含函数声明和变量声明。
  2. 词法环境的创建: 词法环境是一种规范类型,用于管理符号和变量之间的关系,它会在代码执行之前被创建,并在执行期间维护。对于全局执行上下文,词法环境通常与全局变量对象相同;针对函数执行上下文,它会创建一个函数环境,其中包括当前执行上下文内声明的变量和函数。
  3. 绑定 this 值:在创建阶段,JS 引擎还会确定 this 的值,并将其绑定到执行上下文中。

执行阶段

当执行上下文创建完成后,JS 引擎会开始执行代码。JS代码可以定义变量、函数、逻辑判断和控制流,这些操作都会在执行阶段内完成。

示例说明

接下来,我们通过几个示例的说明来加深对执行上下文的理解。

示例1: 全局执行上下文

var x = 'hello ';
console.log(x + y + z);
var y = 'world';

执行上下文的创建过程如下:

  1. 变量环境(Global Environment)被创建并压入调用栈;
  2. 全局变量 x 被创建并分配内存空间;
  3. console 对象及其方法被创建并分配内存空间;
  4. 代码执行顺序到达第二行,JS 引擎尝试打印 x、y 和 z 三个变量的值,由于此时 y 和 z 还未声明,所以它们的值为 undefined;
  5. 变量 y 被创建并分配内存空间,此时它的值为 undefined;
  6. 变量 z 被创建并分配内存空间,此时它的值为 undefined;
  7. 执行上下文被销毁并弹出调用栈。

示例2:函数执行上下文

function foo() {
  var x = 'foo';
  function bar() {
    var y = 'bar';
  }
  bar();
}
foo();

执行上下文的创建过程如下:

  1. 变量环境(Global Environment)被创建并推入调用栈;
  2. 函数 foo() 被创建,并分配内存空间;
  3. 函数 bar() 被创建,并分配内存空间;
  4. 创建 foo() 的执行上下文;
  5. 创建 bar() 的执行上下文;
  6. 把执行控制交给 bar();
  7. bar() 执行完成并从调用栈中弹出,控制权回到 foo() 执行;
  8. foo() 执行完毕并从调用栈中弹出,控制权回到全局执行上下文。

总结

学习 JavaScript 的执行上下文是理解 JavaScript 引擎如何执行代码的关键所在。通过了解它的生命周期、结构和类型,我们可以更好地编写 JavaScript 代码,并避免一些常见的错误。希望本文对您有所帮助!

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

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • java控制Pdf自动打印的小例子

    针对Java控制Pdf自动打印的小例子,下面是完整攻略及示例说明。 1. 背景介绍 在实际工作中,我们经常需要将电子文档打印出来,而Pdf是一种较为常用的电子文档格式。通过Java控制Pdf自动打印,可以提高打印效率、减少人工干预,特别是在需要批量打印的情况下,这种技术能够大大提高工作效率。 2. 实现步骤 2.1 使用iText库 要实现Java控制Pdf…

    JavaScript 2023年5月28日
    00
  • 最新版JavaScript中的箭头函数

    当我们使用JavaScript编写代码时,函数是一种非常重要的语言特性。在最新版本的JavaScript中,引入了箭头函数,这是一种更加简洁和优雅的函数声明方式。在本文中,我们将详细讲解什么是箭头函数以及如何使用箭头函数。 什么是箭头函数? 箭头函数是一种新的函数语法,它可以用更短的代码书写函数。它使用箭头语法 (=>) 声明函数。箭头函数可以用来声明…

    JavaScript 2023年5月27日
    00
  • JS实现的哈夫曼编码示例【原始版与修改版】

    下面我将详细讲解一下“JS实现的哈夫曼编码示例【原始版与修改版】”的完整攻略,包含了两个示例。 哈夫曼编码简介 哈夫曼编码也叫霍夫曼编码,是一种基于变长编码的编码方式。它采用前缀编码的方式,即每个字符的编码都不是其他字符编码的前缀,保证解码的唯一性。哈夫曼编码常被用于数据的压缩和传输,例如常见的压缩文件格式gzip、zip等,以及在网络通信中的数据传输。 原…

    JavaScript 2023年5月19日
    00
  • 使用onbeforeunload属性后的副作用

    使用onbeforeunload属性后的副作用可能会影响到用户的体验,因为当用户尝试关闭页面或者离开页面时,浏览器会弹出一个对话框,询问用户是否确定要离开当前页面。 在使用onbeforeunload属性时,有两个潜在的副作用: 对于复杂的单页应用,当用户尝试离开页面时,可能会触发onbeforeunload事件。即使用户仅仅是在应用中导航到不同的页面或者进…

    JavaScript 2023年6月11日
    00
  • Javascript中正则表达式的全局匹配模式分析

    下面是“Javascript中正则表达式的全局匹配模式分析”的完整攻略。 标题 Javascript中正则表达式的全局匹配模式分析 正文 在Javascript中,正则表达式可以帮助我们完成很多字符串相关操作,包括匹配、替换、提取等。正则表达式的全局匹配模式是其中一种常用模式,下面我们来详细讲解它的使用方法。 在Javascript中,我们可以使用 g 标志…

    JavaScript 2023年6月10日
    00
  • 浅谈javascript中onbeforeunload与onunload事件

    当用户即将关闭页面或者离开当前页面时,JavaScript中提供了两个常见的事件:onbeforeunload和onunload。 onbeforeunload事件 onbeforeunload事件会在页面关闭或者刷新之前触发,它可以用来提示用户保存数据或者进行其他的操作。这个事件触发后,浏览器会弹出一个确认对话框,询问用户是否确定要离开当前页面。 以下是o…

    JavaScript 2023年6月11日
    00
  • discuz中用到的javascript函数解析 原创第2/2页

    下面就是对于“discuz中用到的javascript函数解析 原创第2/2页”的完整攻略: 1. 概述 该文章介绍了 discuz 论坛中常用的 JavaScript 函数解析,主要包括 Ajax 交互、 DOM 操作以及事件处理等。 2. Ajax 交互 2.1 Ajax.call() 该函数用于发送 Ajax 请求,并接收服务器返回的 JSON 格式数…

    JavaScript 2023年6月10日
    00
  • vue-router定义元信息meta操作

    vue-router是Vue.js官方的路由管理库,它可以帮助我们快速开发单页应用程序。在应用程序中,通常会有很多的页面,而有时候需要为这些页面增加一些标识,例如页面标题、页面关键字、页面描述等等。这些标识可以让搜索引擎更好地索引网站内容,也可以让用户更好地理解页面。 为此,vue-router提供了定义元信息meta的操作。元信息指我们在head标签中添加…

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