JS中执行上下文和执行栈是什么?

news2024/9/26 22:35:49

在这里插入图片描述

一:执行上下文

执行上下文是一种对js执行代码的环境的一种抽象,只要js在执行中,那它一定是运行在执行上下文中

执行上下文的类型

  • 全局执行上下文:全局执行上下文是在程序启动时创建的,它包含全局范围定义的变量和函数。在浏览器中,通常是在页面加载时候创建的,它是在页面整个生命周期中都存在的。
  • 函数执行上下文:存在无数个函数执行上下文,但是只有函数被调用时候才会创建函数执行上下文。函数执行上下文包含函数作用域范围内的变量,函数参数,函数和作用域链。
  • eval执行上下文: 指的是运行在 eval 函数中的代码,很少用而且不建议使用

示例

image-20230907172008540

二:生命周期

执行上下文的生命周期为:创建阶段 —> 执行阶段 —> 销毁阶段

2.1 创建阶段

  • 创建阶段:在代码执行之前,会进行对执行上下文的创建
    • 全局执行上下文的创建:在整个程序启动时候,会创建全局执行上下文,其中包含全局函数,全局变量的创建、
    • 函数执行上下文的创建:在函数被调用时,在函数执行前会创建函数执行上下文,其中会构建局部变量,局部函数和作用域链

具体包含三件事

  • ThisBinding:this的绑定
  • LexicalEnvironment(词法环境):创建词法环境
  • VariableEnvironment(变量环境):创建变量环境

执行上下文对象

伪代码

    //执行上下文对象
    const executionContext = {
      //确定this值
      ThisBindings =  { .....},
      //创建词法环境
      LexicalEnvironment =  { ....},
      //创建变量环境
      VariableEnvironment =  { ....},
    }

ThisBinding

this 的值是在执行时(运行时)确定的,而不是在执行上下文创建时确定的。这意味着 this 的绑定是动态的,取决于代码的实际执行情况。

词法环境

词法环境(Lexical Environment)是 JavaScript 中的一个重要概念,用于管理变量和函数的词法作用域

环境记录(Environment Record):环境记录是一个存储变量和函数声明的地方。它可以看作是一个字典或映射,将标识符(如变量名、函数名)映射到对应的值。环境记录有以下两种主要类型:

  • Declarative Environment Record(声明式环境记录): 用于存储变量声明、函数声明等。这种记录可以包含诸如函数的参数、局部变量、函数声明等。
  • Object Environment Record(对象环境记录): 用于与具体的对象相关联,典型的例子是与全局对象或某个特定对象的属性相关联。在这种记录中,标识符会映射到对象的属性上。
GlobalExectionContext = {  // 全局执行上下文
  LexicalEnvironment: {       // 词法环境
    EnvironmentRecord: {     // 环境记录
      Type: "Object",           // 全局环境
      // 标识符绑定在这里 
      outer: <null>           // 对外部环境的引用
  }  
}

FunctionExectionContext = { // 函数执行上下文
  LexicalEnvironment: {     // 词法环境
    EnvironmentRecord: {    // 环境记录
      Type: "Declarative",      // 函数环境
      // 标识符绑定在这里      // 对外部环境的引用
      outer: <Global or outer function environment reference>  
  }  
}
  • 在创建执行上下文的时候,会对不同的执行上下文对象的词法环境类型进行记录
    • 全局执行上下文的词法环境就是Object Environment Record,对象环境记录
    • 函数执行上下文的词法环境就是Declarative Environment Record,声明式环境记录

变量环境

变量环境实际上是词法环境的一个子集

  • 词法环境用于收集存储函数的声明和变量(letconst)的绑定
  • 变量环境用于存储变量(var)的绑定

伪代码

    let a = 10
    const b = 100
    var c = 20

    function sum (number1, numebr2)
    {
      var res = 0
      return res + number1 + number2
    }
	c = sum(20, 30)

执行上下文对象

GlobalExectionContext = {

  ThisBinding: <Global Object>,

  LexicalEnvironment: {  // 词法环境
    EnvironmentRecord: {  
      Type: "Object",  
      // 标识符绑定在这里  
      a: < uninitialized >,  
      b: < uninitialized >,  
      sum: < func >  
    }  
    outer: <null>  
  },

  VariableEnvironment: {  // 变量环境
    EnvironmentRecord: {  
      Type: "Object",  
      // 标识符绑定在这里  
      c: undefined,  
    }  
    outer: <null>  
  }  
}

FunctionExectionContext = {  
   
  ThisBinding: <Global Object>,

    //词法环境
  LexicalEnvironment: {  
    EnvironmentRecord: {  
      Type: "Declarative",  
      // 标识符绑定在这里  
      Arguments: {0: 20, 1: 30, length: 2},  
    },  
    outer: <GlobalLexicalEnvironment>  
  },
      
	//变量环境
  VariableEnvironment: {  
    EnvironmentRecord: {  
      Type: "Declarative",  
      // 标识符绑定在这里  
      res: undefined  
    },  
    outer: <GlobalLexicalEnvironment>  
  }  
}

全局执行上下文对象

  • 词法环境:收集变量let和const的绑定和函数提升
    • 由于let和const定义的a和b变量,不会出现变量提升,所以类型为uninitialized(未初始化状态)
    • sum出现函数提升
    • outer:由于是全局执行上下文,不会再有外部环境的引用,所以类型为Null
  • 变量环境:收集var定义的变量的绑定,由于var定义的变量会出现变量提升,会被初始化为undefined

函数执行上下文对象

  • 词法环境:也收集函数参数
  • 变量类型:res变量提升

2.2 执行阶段

  • 执行阶段:在创建完成之后,会进入执行阶段
    • 代码逐行进行执行,条件判断,语句赋值等都会进行执行
    • 如果遇到函数调用,则会创建函数执行上下文,并且将该函数的执行上下文压入到执行栈

2.3 回收阶段

  • 当代码块执行完毕或函数执行完毕时,执行上下文进入执行结束和销毁阶段。
  • 在这个阶段,局部变量通常会被销毁,内存资源得到释放。

三:执行栈

let a = 'Hello World!';
function first() {
  console.log('Inside first function');
  second();
  console.log('Again inside first function');
}
function second() {
  console.log('Inside second function');
}
first();
console.log('Inside Global Execution Context');

img

执行上下文的创建和销毁是一个动态的过程,由 JavaScript 引擎负责管理。执行上下文的栈结构(调用栈)用于跟踪代码的执行顺序,并确保上下文按照正确的顺序进入和离开。这种生命周期管理有助于确保变量的作用域、函数的调用顺序和内存资源的释放都得以正确执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UltraISO做u盘镜像启动盘

1、工具—刻录光盘映像 2、刻录机选择盘 选择centos镜像 刻录

索尼 toio™应用创意开发征文|一步两步三步模拟浇花系统

目录 1.toio™介绍 2、创意分析 2.1 创意设计 2.2 创意落地 3、创意实现 3.1 环境安装 3.2 核心玩法 总结 1.toio™介绍 索尼的toio™是一款启发创意的机器人产品&#xff0c;旨在通过与真实世界的互动&#xff0c;为各年龄段的用户提供娱乐体验。这款产品具有高度的灵…

【已解决】pyqt5的打包exe软件图标菜单栏/任务栏/小图标/窗口图标未显示

1.起因&#xff1a; 希望&#xff1a;pyqt5 项目&#xff0c;pyinstaller main.spec 打包&#xff0c;我想要 main.exe 就像一个普通的应用软件一样显示我自定义的图标。 结果&#xff1a; main.exe 左侧图标还是老土的样子&#xff0c;并没有成为我的图标。独立运行是&#…

API接口与电商平台之间的联系,采集京东平台数据按关键字搜索商品接口示例

关键字搜索商品的重要性&#xff1a; 1.引入精准流量 关键词第一个也是最重要的作用就是为我们宝贝引进精准的流量&#xff0c;这一作用无论是在自然搜索中还是直通车中都是一样的。 第一步关乎的是我们宝贝的展现&#xff0c;而第二步用户是否会点进我们的宝贝&#xff0c;…

爬虫爬取mp3文件例子

相信训练模型时数据集的获取也是一个很头疼的事情&#xff0c;搞cv领域的可以扛着摄像头架起三脚架拍摄获取&#xff08;以前干过&#xff09;&#xff0c;但是如果是nlp领域的呢&#xff0c;特别是chatgpt等大模型出来后对这类文本等数据的需求更大&#xff0c;如果没有现成的…

攻防世界-WEB-Web_php_include

打开靶机 通过代码审计可以知道&#xff0c;存在文件包含漏洞&#xff0c;并且对伪协议php://进行了过滤。 发现根目录下存在phpinfo 观察phpinfo发现如下&#xff1a; 这两个都为on 所以我们就可以使用data://伪协议 payload如下&#xff1a; - ?pagedata://text/plain,…

测试可用的淘宝API(商品详情数据、买家信息、卖家信息、店铺信息、订单信息)

什么是API? API全称Application Programming Interface&#xff0c;即应用程序编程接口&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定&#xff0c;用于传输数据和指令&#xff0c;使应用程序之间可以集成和共享数据资源。 简单来说&#…

SQL语言的分类:DDL(数据库、表的增、删、改)、DML(数据的增、删、改)

数据库管理系统&#xff08;数据库软件&#xff09;功能非常多&#xff0c;不仅仅是存储数据&#xff0c;还要包含&#xff1a;数据的管理、表的管理、库的管理、账户管理、权限管理等。 操作数据库的SQL语言&#xff0c;基于功能&#xff0c;划分为4类&#xff1a; 1、数据定…

64位Office API声明语句第110讲

【分享成果&#xff0c;随喜正能量】以大慈为所住&#xff0c;给一切众生快乐&#xff0c;观众生心与菩萨心平等平等。以大悲为住处&#xff0c;不轻末学&#xff0c;善根成熟了他会发心&#xff0c;将来也能成佛。舍有为而不执著无为&#xff0c;住无为而不舍有为&#xff0c;…

正方实践系统打卡

Use HTTP (已完成) &#x1f4dc; 使用指南 &#x1f6d6; 项目结构 log 日志文件 use 使用情况 (待) data.py 数据 log.py 日志 main.py 主函数 只需要修改data.py文件内容即可&#xff1a; header ——> 头文件 User-AgentCookieAccept user ——> 用户信息 ZFT…

Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

目录 一、消费者组详细消费流程图解二、消费者的重要参数 一、消费者组详细消费流程图解 创建一个消费者网络连接客户端&#xff0c;主要用于与kafka集群进行交互&#xff0c;如下图所示&#xff1a; 调用sendFetches发送消费请求&#xff0c;如下图所示&#xff1a; (1)、Fet…

RabbitMQ: Routing结构

生产者 package com.qf.mq2302.routing;import com.qf.mq2302.utils.MQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;public class EmitLog {public static final String EXCHANGE_NAME"emitlogs";public static void main(…

基于Jmeter和Jenkins搭建性能测试框架

搭建这个性能测试框架是希望能够让每个人&#xff08;开发人员、测试人员&#xff09;都能快速的进行性能测试&#xff0c;而不需要关注性能测试环境搭建过程。因为&#xff0c;往往配置一个性能环境可能需要很长的时间。 1、性能测试流程 该性能测试框架工作的流程主要有&am…

【代码随想录】dfs和bfs (所有可能的路径、岛屿数量)

所有可能的路径&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:vector<int> path;vector<vector<int>> result;void dfs(vector<vector<int>> graph, int x){//1 确认递归函数…

Java日志框架的扛把子 - SLF4J - SLF4J的原理和实践

1. Java世界中的日志框架 Java世界中的日志框架 其中&#xff0c;slf4j和jcl属于门面日志框架&#xff0c;而其它的几个则是真正干活的ddidic底层日志框架。冷知识&#xff1a;其中标红的日志框架&#xff0c;它们的作者是同一人。不同的日志框架&#xff0c;API接口往往也不一…

解锁前端Vue3宝藏级资料 第一章 带你深入了解Vue3项目创建 2 (使用 Webpack 5 搭建 vue项目)

在之前的文章中&#xff0c;我们已经了解了如何使用Vue CLI来创建Vue项目的开发环境。现在&#xff0c;大家已经可以轻松地运用Vue CLI来构建自己的Vue项目了。然而&#xff0c;你可能仍然对背后的工作原理感到困惑。接下来&#xff0c;我将引导你们在不使用Vue CLI的情况下&am…

Python超入门(1)__迅速上手操作掌握Python

# 1.第一个代码&#xff1a;输出语句 # 1.第一个代码&#xff1a;输出语句 print("My dogs name is Huppy!") print(o----) print( ||| ) print("*" * 10) """ 输出结果&#xff1a; My dogs name is Huppy! o----||| ********** "&…

私有化部署即时通讯平台,完美替代飞书和钉钉的SaaS系统

在当今快速发展的数字化时代&#xff0c;企业对于安全、灵活、可定制的即时通讯平台需求不断增长。作为一家领先的品牌&#xff0c;WorkPlus专注于提供私有化部署的即时通讯平台&#xff0c;完美替代飞书和钉钉的SaaS系统。本文将重点介绍WorkPlus如何通过创新的解决方案&#…

2023高教社杯数学建模B题思路分析 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到…

【MATLAB第72期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入多输出回归预测模型

【MATLAB第72期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入多输出回归预测模型 一、学习资料 (LGBM)是一种基于梯度增强决策树(GBDT)算法。 往期研究了多输入单输出回归预测方法&#xff0c;本次研究多输入多输出回归预测。 参考链接&#xff1a; lightgbm原理参考链…