执行上下文和执行栈

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
  1. 执行上下文(Execution Context)
    • 定义
      • 执行上下文是JavaScript(以下简称JS)中一个非常重要的概念,它是代码在执行过程中所处的环境。可以把它想象成一个容器,这个容器里包含了代码执行时需要的所有信息,比如变量、函数声明、this指针的值等。
    • 组成部分
      • 变量对象(Variable Object):它是执行上下文中的一个重要组成部分,用来存储在当前执行上下文中定义的变量和函数声明。在函数执行上下文中,变量对象会被初始化为活动对象(Activation Object)。例如,在全局执行上下文中,变量对象就是全局对象(在浏览器环境中是window对象),它包含了像documentconsole等全局变量和函数。
      • 作用域链(Scope Chain):它决定了变量和函数的访问权限。作用域链是由当前执行上下文的变量对象和所有包含它的外层执行上下文的变量对象组成的一个链式结构。当在代码中访问一个变量时,JS引擎会沿着作用域链从内向外查找,直到找到这个变量或者到达最外层的全局作用域。例如,在一个函数内部访问一个变量,如果函数内部没有定义这个变量,就会沿着作用域链查找外层作用域中的变量。
      • this指针的值:this指针的值在不同的执行上下文中是不同的。在全局执行上下文中,this指向全局对象(在浏览器环境中是window对象)。在函数执行上下文中,this的值取决于函数的调用方式。如果是作为对象的方法调用,this指向该对象;如果是通过callapplybind方法调用,this的值会根据这些方法的参数来确定;如果是作为普通函数调用,this在非严格模式下指向全局对象,在严格模式下为undefined
  2. 执行栈(Execution Stack)
    • 定义
      • 执行栈也叫调用栈(Call Stack),它是一种数据结构,用于管理函数的调用顺序。当代码开始执行时,会创建一个全局执行上下文并将其压入执行栈。每当一个函数被调用时,就会创建一个新的函数执行上下文并将其压入执行栈,当函数执行完毕后,这个函数的执行上下文就会从执行栈中弹出。
    • 工作原理
      • 例如,有以下代码:
        function a() {
                 
            console.log('a');
        }
        function b() {
                 
            a();
            console.log('b');
        }
        b();
        
      • 当代码开始执行时,首先创建全局执行上下文并将其压入执行栈。然后,当b函数被调用时,会创建b函数的执行上下文并将其压入执行栈。在b函数内部,当a函数被调用时,又会创建a函数的执行上下文并将其压入执行栈。此时执行栈中有三个执行上下文,从栈底到栈顶依次是全局执行上下文、b函数执行上下文、a函数执行上下文。
      • a函数执行完毕,a函数的执行上下文就会从执行栈中弹出。接着b函数继续执行,当b函数执行完毕后,b函数的执行上下文也会从执行栈中弹出,最后只剩下全局执行上下文。
  3. 执行上下文和执行栈的关系
    • 执行栈是执行上下文的管理机制,它通过压入和弹出执行上下文来控制代码的执行顺序。每个执行上下文在执行栈中有自己的位置,并且它们之间存在着调用和返回的关系。当一个函数调用另一个函数时,新的函数执行上下文会被压入执行栈,这就体现了执行栈对执行上下文的管理作用。同时,执行上下文的创建和销毁也会影响执行栈的状态,例如,当一个函数执行完毕后,它的执行上下文从执行栈中弹出,执行栈的高度(即栈中执行上下文的数量)就会减少。这种关系确保了代码能够按照正确的顺序和环境进行执行。
相关文章
|
5天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
64 9
|
4天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
26 4
|
28天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
26 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
8天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
27天前
初步认识栈和队列
初步认识栈和队列
57 10
|
22天前
数据结构(栈与列队)
数据结构(栈与列队)
16 1
|
28天前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
41 3
|
26天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
61 1
|
29天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
28 2
|
1月前
|
Go
数据结构之 - 深入了解栈数据结构
数据结构之 - 深入了解栈数据结构
27 5