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日

相关文章

  • JavaScript ES6中export、import与export default的用法和区别

    当我们在用JavaScript编写模块化代码时,我们会经常用到export、import和export default等关键字。下面我们来介绍它们的用法及区别。 export export关键字用于将一个或多个模块内的变量、函数、类等暴露给外部使用。它通常被写在一个模块的底部,用法如下: // module.js export const name = ‘T…

    JavaScript 2023年5月28日
    00
  • JS实现文件动态顺序载入的方法

    当需要在网页中引用多个JS文件时,如果按照常规方式直接引用,可能会因为文件之间的依赖关系导致错误。这时就需要使用JS实现文件动态顺序载入的方法。以下是实现该方法的攻略: 1. 动态创建script标签 使用JS动态创建script标签,将需要使用的JS文件依次插入到HTML文档中。每插入一个文件就为其绑定一个“onload”事件,在JS文件载入完成后触发该事…

    JavaScript 2023年5月27日
    00
  • js简单判断移动端系统的方法

    判断移动端系统是JS中非常常见的一个需求,下面给出几种判断方式: 方法一:根据navigator.userAgent字符串进行判断 移动端设备的 UA(UserAgent)字符串中,都会包含操作系统的信息,因此我们可以通过解析 UA 字符串来判断设备使用的操作系统。其中一些常见的 UA(UserAgent)字符串包括: Android:/Android/i …

    JavaScript 2023年6月10日
    00
  • JS获取html对象的几种方式介绍

    以下是关于JS获取html对象的几种方式的完整攻略: 1. 通过id获取对象 我们可以通过id来获取html对象。具体步骤如下: var obj = document.getElementById(‘idName’); 其中,’idName’是你想要获取的id名称。这个方法在页面中只能有一个元素拥有该id才能生效。 举个例子,如果你想获取以下html代码中的…

    JavaScript 2023年5月27日
    00
  • JavaScript文档碎片操作实例分析

    下面我将为您详细讲解“JavaScript文档碎片操作实例分析”的完整攻略。 什么是文档碎片? 文档碎片(DocumentFragment)是在DOM中经常使用的一个API,它代表一个没有父级节点的文档片段,可以包含多个子节点。它的主要功能是在内存中构建DOM节点,然后一次性地将它们添加到页面上,避免了频繁地操作DOM而导致的性能问题。 如何使用文档碎片? …

    JavaScript 2023年6月10日
    00
  • JavaScript前端开发之实现二进制读写操作

    JavaScript前端开发之实现二进制读写操作 在JavaScript中,读取和操作二进制数据是一个非常实用的技能。以下是实现二进制读写操作的完整攻略。 使用ArrayBuffer 在JavaScript中实现二进制读写操作的最常用的方法是使用ArrayBuffer对象。ArrayBuffer在内部表示二进制数据,可以直接快速读取和操作。以下是创建和初始化…

    JavaScript 2023年5月19日
    00
  • 详解VueRouter 路由

    详解 VueRouter 路由 VueRouter 是 Vue.js 的官方路由管理器,它可以将不同的 URL 地址映射到不同的组件,并且在组件之间进行快速切换和传递数据。在本文中,我们将详细讲解 VueRouter 的使用方法,包括安装、基本用法、动态路由、嵌套路由等内容。 安装 安装 VueRouter 非常简单,只需要在终端中运行以下命令: npm i…

    JavaScript 2023年6月11日
    00
  • JavaScript关于某元素点击事件的监听和触发

    下面是关于JavaScript中某元素点击事件的监听和触发的完整攻略: 监听点击事件 在JavaScript中,可以通过addEventListener方法监听元素的点击事件,方法需要两个参数,第一个参数是事件名称,第二个参数是要触发的回调函数。例如: // 获取元素 const btn = document.getElementById(‘btn’); /…

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