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

一、执行上下文

简单的来说,执行上下文是一种对Javascript代码执行环境的抽象概念,也就是说只要有Javascript代码运行,那么它就一定是运行在执行上下文中

执行上下文的类型分为三种:

  • 全局执行上下文:只有一个,浏览器中的全局对象就是 window对象,this 指向这个全局对象
  • 函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文
  • Eval 函数执行上下文: 指的是运行在 eval 函数中的代码,很少用而且不建议使用

下面给出全局上下文和函数上下文的例子:

紫色框住的部分为全局上下文,蓝色和橘色框起来的是不同的函数上下文。只有全局上下文(的变量)能被其他任何上下文访问

可以有任意多个函数上下文,每次调用函数创建一个新的上下文,会创建一个私有作用域,函数内部声明的任何变量都不能在当前函数作用域外部直接访问

二、生命周期

执行上下文的生命周期包括三个阶段:创建阶段 → 执行阶段 → 回收阶段

创建阶段

创建阶段即当函数被调用,但未执行任何其内部代码之前

创建阶段做了三件事:

  • 确定 this 的值,也被称为 This Binding
  • LexicalEnvironment(词法环境) 组件被创建
  • VariableEnvironment(变量环境) 组件被创建

伪代码如下:

解释

ExecutionContext = { ThisBinding = <this value>, // 确定this LexicalEnvironment = { ... }, // 词法环境 VariableEnvironment = { ... }, // 变量环境 }

This Binding

确定this的值我们前面讲到,this的值是在执行的时候才能确认,定义的时候不能确认词法环境

词法环境有两个组成部分:

  • 全局环境:是一个没有外部环境的词法环境,其外部环境引用为null,有一个全局对象,this 的值指向这个全局对象

  • 函数环境:用户在函数中定义的变量被存储在环境记录中,包含了arguments 对象,外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境

伪代码如下:

解释

GlobalExectionContext = { // 全局执行上下文 LexicalEnvironment: { // 词法环境 EnvironmentRecord: { // 环境记录 Type: "Object", // 全局环境 // 标识符绑定在这里 outer: <null> // 对外部环境的引用 } } FunctionExectionContext = { // 函数执行上下文 LexicalEnvironment: { // 词法环境 EnvironmentRecord: { // 环境记录 Type: "Declarative", // 函数环境 // 标识符绑定在这里 // 对外部环境的引用 outer: <Global or outer function environment reference> } }

变量环境

变量环境也是一个词法环境,因此它具有上面定义的词法环境的所有属性

在 ES6 中,词法环境和变量环境的区别在于前者用于存储函数声明和变量( let 和 const )绑定,而后者仅用于存储变量( var )绑定

举个例子

解释

let a = 20; const b = 30; var c; function multiply(e, f) { var g = 20; return e * f * g; } c = multiply(20, 30);

执行上下文如下:

解释

GlobalExectionContext = { ThisBinding: <Global Object>, LexicalEnvironment: { // 词法环境 EnvironmentRecord: { Type: "Object", // 标识符绑定在这里 a: < uninitialized >, b: < uninitialized >, multiply: < 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", // 标识符绑定在这里 g: undefined }, outer: <GlobalLexicalEnvironment> } }

留意上面的代码,letconst定义的变量ab在创建阶段没有被赋值,但var声明的变量从在创建阶段被赋值为undefined

这是因为,创建阶段,会在代码中扫描变量和函数声明,然后将函数声明存储在环境中

但变量会被初始化为undefined(var声明的情况下)和保持uninitialized(未初始化状态)(使用letconst声明的情况下)

这就是变量提升的实际原因

执行阶段

在这阶段,执行变量赋值、代码执行

如果 Javascript 引擎在源代码中声明的实际位置找不到变量的值,那么将为其分配 undefined 值

回收阶段

执行上下文出栈等待虚拟机回收执行上下文

二、执行栈

执行栈,也叫调用栈,具有 LIFO(后进先出)结构,用于存储在代码执行期间创建的所有执行上下文

Javascript引擎开始执行你第一行脚本代码的时候,它就会创建一个全局执行上下文然后将它压到执行栈中

每当引擎碰到一个函数的时候,它就会创建一个函数执行上下文,然后将这个执行上下文压到执行栈中

引擎会执行位于执行栈栈顶的执行上下文(一般是函数执行上下文),当该函数执行结束后,对应的执行上下文就会被弹出,然后控制流程到达执行栈的下一个执行上下文

举个例子:

解释

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');

转化成图的形式

简单分析一下流程:

  • 创建全局上下文请压入执行栈
  • first函数被调用,创建函数执行上下文并压入栈
  • 执行first函数过程遇到second函数,再创建一个函数执行上下文并压入栈
  • second函数执行完毕,对应的函数执行上下文被推出执行栈,执行下一个执行上下文first函数
  • first函数执行完毕,对应的函数执行上下文也被推出栈中,然后执行全局上下文
  • 所有代码执行完毕,全局上下文也会被推出栈中,程序结束

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

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

相关文章

2023上半年下午1,2

问题1不要看图1-1父图&#xff0c;直接看图1-2子图去找 用户就是农户和租户 按数据流输入的词语后面加表字即D的名称&#xff0c;流向D的 信息有包含&#xff0c;子图加了&#xff0c;父图就不平衡了 添加图一般不加实体&#xff0c;加联系&#xff08;菱形&#xff09;&#x…

Linux基础(2)

学习地点&#xff08;泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 (bilibili.com)&#xff09; LInux目录介绍 Linux常见目录及作用 /&#xff1a;操作系统的根路径 /bin&#xff1a;存储二进制可执行目录&#xff0c;普通用户和管理员都可以执行的命令 /etc&#xff1a;…

算法简介:动态规划

动态规划 1. 动态规划2. 案例2.1 旅游行程最优化2.2 最长公共子串 1. 动态规划 背包问题&#xff1a;背包可以容纳的重量是4磅&#xff0c;吉他为1磅&#xff0c;价值1500元&#xff1b;音响为4磅&#xff0c;价值3000元&#xff1b;笔记本电脑为3磅&#xff0c;价值为2000元。…

解释区块链技术的应用场景和优势。

区块链技术的应用场景包括但不限于以下几个方面&#xff1a; 1. 金融领域&#xff1a;区块链技术可以用于跨境支付、智能合约、数字货币和资产管理等方面&#xff0c;提供更安全、快速和可追溯的交易体验。 2. 物联网领域&#xff1a;区块链技术可以为物联网设备提供身份验证…

【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR

近日&#xff0c;阿里云人工智能平台PAI与复旦大学王鹏教授团队合作&#xff0c;在自然语言处理顶级会议EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。文章提出了一个名为 TAPIR 的知…

棱镜七彩参加“融易行”产融对接南京站项目路演活动 展示供应链安全创新成果

近日&#xff0c;江苏省软件强链“融易行”产融对接南京站活动圆满举行&#xff0c;棱镜七彩作为江苏省重点软件企业受邀参加活动&#xff0c;并展示了公司在供应链安全与开源治理方面的创新成就。 本次活动由江苏省工业和信息化厅、南京市工业和信息化局主办&#xff0c;关键软…

5_api_intro_imagerecognition_html2word

HTML 转 Word API 接口 支持网页转 Word&#xff0c;高效转换为 Word&#xff0c;提供永久链接。 1. 产品功能 超高性能转换效率&#xff1b;支持将传递的 HTML 转换为 Word&#xff0c;支持 HTML 中的 CSS 格式在 Word 文档中的呈现&#xff1b;支持传递网站的 URL&#xff0c…

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析&#xff0c;特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力&#xff0c;以对象为为驱动的模型&#xff0c;主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

蓝桥杯 懒洋洋字符串--字符串读入

题目 代码 #include <iostream>using namespace std;int main(){int n;cin>>n;char s[210][4];int ans0;for(int i0;i<n;i){scanf("%s",s[i]);}for(int i0;i<n;i){char as[i][0];char bs[i][1];char cs[i][2];// cout<<a<< <<b…

GS-Blur数据集:首个基于3D场景合成的156,209对多样化真实感模糊图像数据集。

2024-10-31&#xff0c;由韩国首尔国立大学的研究团队创建的GS-Blur数据集&#xff0c;通过3D场景重建和相机视角移动合成了多样化的真实感模糊图像&#xff0c;为图像去模糊领域提供了一个大规模、高覆盖度的新工具&#xff0c;显著提升了去模糊算法在真实世界场景中的泛化能力…

【Python】实战:定义一个圆的类并计算面积和周长

class Circle: # Circle类def __init__(self, r):self._r r # 将半径r赋值给实例属性self._rdef get_area(self): # 计算面积;前后双下划线通常用于特殊方法&#xff0c;而常规方法应使用普通命名pi 3.1415926area pi * self._r * self._rreturn areadef get_perimeter(s…

基于vue框架的的热点推荐个性化新闻系统的设计与实现ka0x6(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,新闻类型,省份,时事新闻,视频新闻 开题报告内容 基于Vue框架的热点推荐个性化新闻系统的设计与实现开题报告 一、项目背景 随着互联网技术的飞速发展和信息量的爆炸式增长&#xff0c;新闻资讯已成为人们日常生活中不可或缺的一…

.NET 10月红队武器库18款工具汇总

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

计算机毕业设计 | SpringBoot慈善公益平台 爱心互助活动发布管理系统(附源码)

1&#xff0c;项目介绍 爱慈善公益平台&#xff08;love-charity&#xff09;是一个基于 SpringBoot 开发的标准 Java Web 项目。整体页面非常的简约大气&#xff0c;项目的完整度较高&#xff0c;是一个偏向公益论坛的系统。非常适合刚刚接触学习 SpringBoot 的技术小白学习&…

使用Python实现音频降噪

在音频处理领域&#xff0c;背景噪声是一个常见的问题。为了提高音频的质量&#xff0c;我们需要对音频进行降噪处理。本文将介绍如何使用 Python 实现音频降噪。 依赖库安装 在开始之前&#xff0c;我们需要安装以下依赖库&#xff1a; pydub&#xff1a;用于音频文件的读取…

科大讯飞面经,蛮简单的

先来看面经&#xff1a; 下面我来简单聊聊这些问题。 自我介绍 关于如何自我介绍&#xff0c;这个如果还不会或者还没有准备&#xff0c;请先准备好你要如何向面试官介绍自己。 面试本来就是一个自我推销的方式之一&#xff0c;如果自我介绍都不会说&#xff0c;你如何卖个好价…

ARM64汇编寻址、汇编指令、指令编码方式

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ ARM64汇编寻址 1. 立即数寻址&#xff08;Immediate Addressing&#xff09; 这种方式直接将立即数作为操作数&#xff0c;适合小数据或常量。ARM64的立即数…

创建者模式之【建造者模式】

建造者模式 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。由于实现了构建和…

什么是CANN和Ascend C

1 CANN是什么 异构计算架构CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为针对AI场景推出的异构计算架构&#xff0c;向上支持多种AI框架&#xff0c;包括MindSpore、PyTorch、TensorFlow等&#xff0c;向下服务AI处理器与编程&#xff0c;发挥…

GenAI 用于客户支持 — 第 5 部分:可观察性

作者&#xff1a;来自 Elastic Andy James 本系列将带你深入了解我们如何在客户支持中使用生成式人工智能。加入我们&#xff0c;实时分享我们的历程&#xff0c;本篇文章重点介绍支持助理的可观察性。 本博客系列揭示了我们的现场工程团队如何使用 Elastic stack 和生成式 AI …