JS知识点汇总(五)--执行上下文

news/2024/12/5 7:40:52/

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

1、执行上下文

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

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

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

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

2、生命周期

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

  • 创建阶段

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

    • 确定 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 )绑定。

    创建阶段,会在代码中扫描变量和函数声明,然后将函数声明存储在环境中。但变量会被初始化为undefined(var声明的情况下)和保持uninitialized(未初始化状态)(使用let和const声明的情况下),也就是变量提升

  • 执行阶段

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

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

  • 回收阶段

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

3、执行栈

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

  • 当Javascript引擎开始执行你第一行脚本代码的时候,它就会创建一个全局执行上下文然后将它压到执行栈中
  • 每当引擎碰到一个函数的时候,它就会创建一个函数执行上下文,然后将这个执行上下文压到执行栈中
  • 引擎会执行位于执行栈栈顶的执行上下文(一般是函数执行上下文),当该函数执行结束后,对应的执行上下文就会被弹出,然后控制流程到达执行栈的下一个执行上下文
let a = 'Hello World!';
function first() {console.log('first');second();console.log('again first');
}
function second() {console.log('second ');
}
first();
console.log('global ');
//first
//second 
//again first
//global 

在这里插入图片描述

分析下流程:

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

http://www.ppmy.cn/news/660860.html

相关文章

集成测试、单元测试、系统测试之间的关系和区别

目录 前言 什么是集成测试&#xff1f; 什么是单元测试&#xff1f; 什么是系统集成测试&#xff1f; 集成测试与单元测试 系统测试与集成测试 总结&#xff1a; 前言 为了使软件正常工作&#xff0c;所有单元都应集成在一起并正常运行。集成测试就像是要求不同工种的工…

嵌入式常用软件/工具

工欲善其事&#xff0c;必先利其器。开发嵌入式或者其他的代码编写&#xff0c;有工具使用会好很多。以下总结几个常用的顺手工具&#xff1a; 1、Source Insight 快速查看代码&#xff0c;以及方便翻阅关联代码 2、Beyond Compare 比较代码文件和文件夹&#xff0c;用来改代码…

word中插入页码

选择“插入”选项卡&#xff0c;单击“页眉和页脚”组中的“页码”命令&#xff0c;打开“页码”下拉列表&#xff0c;在列表里选中页码插入的位置即可。 对页码的格式可以进行修改&#xff0c;单击“页码”下拉列表中的“设置页码格式”命令&#xff0c;打开“页码格式”对话框…

Word文档页码如何从第三页(或某一页)开始添加

背景 有时候写论文或者报告会要求页码从正文那一页再开始添加&#xff0c;经过自己的摸索尝试&#xff0c;终于找到了解决方法&#xff0c;如下所示。 解决方法 假若要从第三页开始添加页码 将光标定位到第二页的最末尾的位置&#xff0c;然后点击&#xff1a;布局->分割…

Word如何从中间页插入页码

Word如何从中间页插入页码 第一步-添加分节符 光标置于起始页码得上一页&#xff0c;点击【布局】->【分隔符】->【分节符下一页】 第二步-设置页码格式 点击【插入】->【页码】->【设置页码格式】 选中【起始页码】&#xff0c;设置起始页为‘1’ 第三步-…

word插入页码技巧

最近需要打印项目结题报告&#xff0c;在排版上遇到了些困难。 第一个是目录制作。原来都是手工制作的&#xff0c;这样做出来的既难看&#xff0c;又不稳定&#xff0c;只要稍微改下正文中的内容&#xff0c;目录又得重新修改。所以最好得办法当然是用word自动给我们生成。在h…

word文档任意位置开始插入页码

这里举例子一共三面&#xff0c;第一面内容“测试”&#xff0c;第二面内容“第一页”&#xff0c;第三面内容“第二页”&#xff0c;从第二面内容“第一页”开始插入页码。 1.在要开始插入页码的上一页点击布局-》分割符-》下一页 2.插入-》页码-》页面底部-》选中一种样式 3…

4- word 从任意页面插入页码,前面页面不要页码,以及页码处的横线问题

教程视频 需求是从我指定的从任意页面插入页码,前面页面不要页码。 1、找点需要插入页面的前一页&#xff0c;将光标放在此页&#xff0c;然后点击 布局-》分隔符-》下一页。 2、经过第一步&#xff0c;我们已经将光标移到了需要插入页面的页面&#xff0c;此时点击&#xf…