Javascript的Execution Context

概要

本文主要通过一个实例,来理解什么是Javascript中的Execution Context,以及在JavaScript执行过程中,Execution Context是如何工作的。

基本概念

事实上,我们可以理解为JavaScript代码在一个盒子中执行,而这个盒子本身就是我们的Execution Context。

在这里插入图片描述
代码在执行过程中,可以在这个盒子中找到需要的变量,函数等信息。

对于复杂的JavaScript项目,代码量庞大,代码运行过程中可能需要多个Execution Context,这些Execution Context按照类型,可以划分为Global Execution Context (GEC) 和 Function Execution Context (FEC)。

  • GEC是基本的执行上下文,它的代码层级最高且只有一个,用于创建全局对象和将this绑定到全局对象上。
  • FEC是函数的执行上下文,在函数被调用的时候由JS Engine创建,可以有多个。

所有的JavaScript代码都要在 Call Stack中执行,Call Stack将上述的Execution Context 组织在一起,由JS Engine逐行执行。

实例

下面我看一段简单的JavaScript代码

var a = 0;
test1();
test2();
console.log(a);
function test1() {
    var a = 10;
    console.log(a);
}
function test2() {
    var a = 20;
    console.log(a);
}

代码执行结果如下:

在这里插入图片描述
下面我们按照JS Engine的运行方式,解释一下代码是如何执行的

Step 1 建立 GEC

在创建GEC的时候,并不会对将变量值载入本地内存,这个时候变量a的值只是undefined,但是test1和test2S是两个全局的函数,会被载入本地内存。
在这里插入图片描述
我们设置好断点,可以看到,代码执行如我们上面示意图期待的那样

在这里插入图片描述
在这里插入图片描述

此时GEC进入Call Stack

在这里插入图片描述

Step 2 执行 GEC中的Global代码

执行赋值操作如下:
在这里插入图片描述
赋值操作执行后,本地内存中变量a由undefined变成0,代码执行后,从Call Stack中删除

在这里插入图片描述
在浏览器中,GEC的a变量也被赋值为0
在这里插入图片描述

Step 2 执行 GEC中的test1函数

test1是一个函数,一旦被调用,该函数立刻进入Call Stack,JS Engine会为它创建一个独立的FEC。

在这里插入图片描述
初始状态下,a变量是undefined。函数开始I执行后,a被赋值为10,即FEC中的a变量被赋值为10。

在这里插入图片描述
此时GEC中的a变量并不会影响FEC中的a变量。JS Engine会先在自己的FEC中查看是否有变量a,如果找到,就会直接使用。

浏览器中断点的截图如下:

在这里插入图片描述
在test1方法执行完成后,函数的FEC,变量和函数代码全部从Call Stack移除。

在这里插入图片描述

Step 3 执行 GEC中的test2函数

test2也是一个函数,一旦被调用,该函数会立刻进入Call Stack,JS Engine会为它创建一个独立的FEC。

在这里插入图片描述
初始状态下,a变量是undefined。函数开始I执行后,a被赋值为20,FEC中的a变量被赋值为20。

在这里插入图片描述
此时GEC中的a变量并不会影响FEC中的a变量。JS Engine会先在自己的FEC中查看是否有变量a,如果找到,就会直接使用。

浏览器中断点的截图如下:

在这里插入图片描述
在test2方法执行完成后,函数的FEC,变量和函数代码全部从Call Stack移除。

在这里插入图片描述

Step 4 执行完成

删除GEC,释放内存空间。从截图中我们可以看到,浏览器中所有相关的代码,变量和函数全部被删除了。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 建立链接(ln)

目录 1、ln命令 创建软链接: 创建硬链接: 2、输出重定向(>/>>) 3、管道(|) 1、ln命令 (英文全拼:link files)为某一个文件在另外一个位置建立一个同步的…

如何使用vue定义组件之——子组件调用父组件数据

1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --><!-- <my-…

如何实现sam(Segment Anything Model)|fastsam模型

sam是2023年提出的一个在图像分割领域的大模型&#xff0c;其具备了对任意现实数据的分割能力&#xff0c;其论文的介绍可以参考 https://hpg123.blog.csdn.net/article/details/131137939&#xff0c;sam的亮点在于提出一种工作模式&#xff0c;同时将多形式的prompt集成到了语…

武汉星起航:秉承客户至上服务理念,为创业者打造坚实后盾

在跨境电商的激荡浪潮中&#xff0c;武汉星起航电子商务有限公司一直秉持着以客户为中心的发展理念&#xff0c;为跨境创业者提供了独特的支持和经验积累&#xff0c;公司通过多年的探索和实践&#xff0c;成功塑造了一个以卖家需求为导向的服务平台&#xff0c;为每一位创业者…

专升本 C语言笔记-03 变量的作用域

1.变量的概念 内存中有个存储区域,这个地方的数据可以在同一类型范围内不断变化通过变量名,可以访问这块内存区域,获取里面的值; 变量名的构成:数据类型 变量名 值 C语言中变量声明格式: 数据类型 变量名 值 2.变量的注意 2.1.全局变量: 定义在函数外部的叫全局变量…

监听抖音直播间的评论并实现存储

监听抖音直播间评论&#xff0c;主要是动态监听dom元素的变化&#xff0c;如果评论是图片类型的&#xff0c;获取alt的值 主要采用的是MutationObserver&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver index.js如下所示:function getPL() {…

交流回馈老化测试负载如何实现这些功能的

交流回馈老化测试负载是一种用于模拟电力系统中各种负载特性的装置&#xff0c;它可以对电力设备进行长时间的老化测试&#xff0c;以确保其在实际运行中的稳定性和可靠性。交流回馈老化测试负载主要通过以下几个方面实现这些功能&#xff1a; 1. 模拟负载特性&#xff1a;交流…

科普:防泄密软件下载(实用+收藏篇)

防泄密软件是企业构建安全信息环境、保障业务稳定发展的重要工具。是一种专门用于保护数据安全、防止信息泄露的软件工具。 它能够监控和管理电脑的使用行为&#xff0c;防止敏感数据被非法获取、篡改或传播。 防泄密软件通过实时监控、加密技术、访问控制等手段&#xff0c;…

C# EPPlus导出dataset----Excel2绘制图像

一、生成折线图方法 /// <summary> ///生成折线图 /// </summary> /// <param name="worksheet">sheet页数据 </param> /// <param name="colcount">总列数</param> /// &l…

LarkXR上新了 | Apollo多终端与XR体验的优化创新

作为领先的数字平行世界产品技术提供方&#xff0c;「Paraverse平行云」一直致力于为企业和开发者提供企业级实时云渲染解决方案。其多终端接入产品LarkXR Apollo&#xff0c;基于底层Runtime技术&#xff0c;实现了在Windows、Linux、MacOS、Android、iOS等多种操作系统下&…

mysql中文乱码解决方案

mysql中文乱码解决方案 现象 查看配置时&#xff0c;字符编码已经全是utf8&#xff0c;但查询时中文还是乱码&#xff1a; 原因 虽然查看字符编码时已经是utf8&#xff0c;但当数据库被连接时&#xff0c;可能还会是协商出其他的编码。 解决 需要强制将协商的编码都变成…

机试:成绩排名

问题描述: 代码示例: #include <bits/stdc.h> using namespace std;int main(){cout << "样例输入" << endl; int n;int m;cin >> n;int nums[n];for(int i 0; i < n; i){cin >> nums[i];}// 排序for(int i 0; i < n; i){//…

[c++] 右值引用

1 左值和左值引用 在说右值引用之前&#xff0c;需要先说一下左值引用。当然&#xff0c;在右值引用出现之前&#xff0c;左值引用也不叫左值引用&#xff0c;就叫引用。现在一般也直接将左值引用称作引用&#xff0c;将右值引用称作右值引用。左值引用类似于 c 语言中经常使用…

算法详解——图的深度优先遍历和广度优先遍历

目录 一、图结构二、深度优先遍历2.1 图的遍历2.2 深度优先遍历过程2.3 深度优先遍历核心思想2.4 深度优先遍历实现 三、广度优先遍历3.1 广度优先遍历过程3.2 广度优先遍历核心思想3.3 广度优先遍历实现 参考文献 一、图结构 图结构指的是如下图所示的由节点和边组成的数据。 …

力扣刷题Days18-190颠倒二进制位(js)

目录 1&#xff0c;题目 2&#xff0c;代码 1&#xff0c;逐位颠倒 800001011 循环过程&#xff1a; 最终结果&#xff1a; 3&#xff0c;学习与总结 1&#xff0c;<< 位运算符 1&#xff0c;题目 颠倒给定的 32 位无符号整数的二进制位。 2&#xff0c;代码 1…

高频:spring知识

1、bean的生命周期&#xff1f; 主要阶段 初始化 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext67424e82: startup date []; root of context hi…

代码原理文献阅读(4)_3.12

4.2.经济调度问题(ED) 事实上&#xff0c;UC本质上也是一种ED问题。但随着电力电子技术的快速发展&#xff0c;越来越多的新型设备接入电力系统&#xff0c;调度逐渐变得"杂"、"散"、"灵活" 。此时&#xff0c;系统受到不确定性的影响更加强烈&a…

微信小程序 uniapp+vue学生考勤签到系统19j29

签到基本是没一个学生和教育工作者都要面对的一个事情&#xff0c;传统的签到都是需要单独找老师签到&#xff0c;或者老师课堂上单名来完成的&#xff0c;但是随着时代的发展这种比较落后的管理方式已经逐渐的被广大高校摒弃&#xff0c;教育工作者需要一种更加灵活且操作方便…

OCR-free相关论文梳理

⚠️注意&#xff1a;暂未写完&#xff0c;持续更新中 引言 通用文档理解&#xff0c;是OCR任务的终极目标。现阶段的OCR各种垂类任务都是通用文档理解任务的子集。这感觉就像我们一下子做不到通用文档理解&#xff0c;退而求其次&#xff0c;先做各种垂类任务。 现阶段&…

Linux系统架构----Tomcat 部署

一.Tomcat概述 Tomcat服务器是一个免费的开放式源代码的web应用服务器&#xff0c;属于轻量级应用级服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首首选。 一般来说&#xff0c;tomcat虽然和Apache或者Nginx这些…