首页 > 编程语言 >JavaScript 上下文 和 执行栈

JavaScript 上下文 和 执行栈

时间:2024-09-16 17:02:35浏览次数:8  
标签:上下文 函数 创建 JavaScript 环境 执行 变量

执行上下文

执行上下文是对 JavaScript 代码执行环境的概念抽象,只要有js代码运行,它就一定运行在执行上下文中

执行上下文分为三种

  • 全局执行上下文:也就是浏览器的全局对象 window
  • 函数执行上下文:每次函数被调用时都会(才会)创建一个新的执行上下文
  • Eval执行上下文:运行在 Eval 函数中的代码, 很少用且不建议使用

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

执行上下文的生命周期:创建、执行 和 回收

创建阶段:函数被 调用 ,但 执行之前

  1. 确定 this 的值,也被成为 This Binding
  2. LexicalEnvironment(词法环境) 组件被创建
    词法环境由两个部分组成:
    1. 全局环境:是一个没有外部环境的词法环境,外部引用环境为 null ,有一个全局对象,this 就指向这个全局对象
    2. 函数环境:用户在函数中定义的变量被存储在环境记录中,包含了 arguments 对象,外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境
  3. VariableEnvironment(变量环境) 组件被创建 
    变量环境也是一个词法环境,因此它具有上面定义的词法环境的所有属性在 ES6 中,词法环境和变量环境的区别在于前者用于存储函数声明和变量(let和 const )绑定,而后者仅用于存储变量(var)绑定
// 执行上下文 伪代码
GlobalExceptionContext = {
    LexicalEnvironment: {
        EnvironmentRecords: {
            Type: "Object",
            outer: "null"
        }
    }
}

FunctionExceptionContext = {
    LexicalEnvironment: {
        EnvironmentRecords: {
            Type: "Declarative",
            outer: "Global or outer function Environment reference"
        }
    }
}
// 示例代码
let a = 20;
const b = 30;
var c;

function multiplay(e, f) {
    var g = 20;
    return e * f * g;
}

c = multiplay(a, b)

// 执行过程
GlobalExectionContext = {
    ThisBinding: "Global Object",
    LexicalEnvironment: { //
        EnvironmentRecord: {
            Type: "Object",
            a: "uninitialized",
            b: "uninitialized",
            multiply: "func"
        },
        outer: "null"
    },
    VariableEnvironment: { //
        EnvironmentRecord: {
            Type: "Object",
            c: undefined,
        },
        outer: "null"
    }
}

FunctionExceptionContext = {
    ThisBinding: "Global Object",

    LexicalEnvironment: {
        EnvironmentRecords: {
            Type: "Declarative",
            Arguments: {0: 20, 1: 30, length: 2}
        },
        outer: "GlobalLexicalEnvironment",
    },

    VariableEnvironment: {
        EnvironmentRecords: {
            Type: "Declarative",
            g: undefined,
        },
        outer: "GlobalLexicalEnvironment",
    }
}

let 和 const 定义的变量 a和 b 在创建阶段没有被赋值,但 var 声明的变量从在创建阶段被赋值为 undefined

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

执行阶段:执行变量赋值、执行代码

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

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

执行栈

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

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

每当引擎碰到一个函数的时候,它就会创建一个函数执行上下文,然后将这个执行上下文压到执行栈中引擎会执行位于执行栈栈顶的执行上下文(一般是函数执行上下文),当该函数执行结束后,对应的执行上下文就会被弹出,然后控制流程到达执行栈的下一个执行上下文

标签:上下文,函数,创建,JavaScript,环境,执行,变量
From: https://www.cnblogs.com/xxaxf/p/18416407

相关文章

  • 深入理解 ECMAScript 和 JavaScript
    目录ECMAScript是什么?JavaScript是什么?示例ECMAScript示例JavaScript示例总结ECMAScript是什么?ECMAScript是一个由国际标准化组织ECMA(欧洲计算机制造商协会)维护的脚本语言标准。这个标准定义了一种脚本语言的基本特性,包括语法、类型系统、内置对象、关键字等......
  • Nuxt Kit 中的上下文处理
    title:NuxtKit中的上下文处理date:2024/9/16updated:2024/9/16author:cmdragonexcerpt:NuxtKit提供的上下文处理工具,尤其是useNuxt和tryUseNuxt,为模块化开发提供了极大的便利。通过这些函数,开发者可以方便地访问Nuxt实例,从而更好地管理应用配置。categories......
  • JavaScript-apply、bind、call
    call、apply、bind作用是改变函数执行时的上下文,简而言之就是改变函数运行时的this指向区别 applyapply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次当第一个参数......
  • Android HandlerThread Post后延迟7秒才执行的原因及解决方案|如何提高Android后台线程
    在Android开发中,HandlerThread是用于处理后台线程任务的常见工具。然而,有时我们会遇到这样的问题:当任务通过HandlerThread的post方法发送后,任务的执行时间会出现明显的延迟,比如7秒的延迟才执行任务。本文将深入分析这种问题的成因,探讨可能的影响因素,并提供多种优化方案,帮助开发者解......
  • JavaScript 手写new操作符
    new关键字的工作步骤创建一个新的对象obj将对象与构建函数通过原型链连接起来将构建函数中的this绑定到新建的对象obj上根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象,需要正常处理constrecodeNew=function(Func,...args){//获取函数对象......
  • 【油猴脚本】00008 案例 Tampermonkey油猴脚本,动态渲染表格-实现页面动态-添加表格列,
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • kettle从入门到精通 第八十五课 ETL之kettle kettle中javascript步骤调用外部javascri
     场景:交流学习群里面有小伙伴咨询kettle中的javascript代码步骤如何调用外部js文件中的函数,觉得有点意思的,于是就抽时间整理了一下。 1、外部js文件为test.js,代码如下:functiontest(param){return"接收到了参数"+param;}2、当时没有过多考虑,在本地简单写了个demo测......
  • Spring Boot 执行流程已经 负载均衡执行流程图
    这个流程图展示了SpringBoot如何通过多层次的并发处理(多实例、线程池、数据库连接池等)来实现高并发访问。每一层都在努力最大化并发处理能力,同时保持资源的有效利用。关键点:负载均衡实现了请求的初步分发线程池管理并发请求数据库连接池优化数据库访问多个SpringBoot......
  • [Javascript Vue] Improve heavy component loading performance
    Let'ssaywehaveaVueapplicationthatrendersmanyheavycomponentsonthefirstload.Theproblemwe'refacingisalongwhitescreenperiodwhileJavaScriptisloadingandthebrowserispainting.Howcanweoptimizeperformance?Sincethe......
  • H3C 网络设备定时执行任务
    1、组网拓扑定时执行任务拓扑2、组网需求对Device进行配置,在星期一到星期五的上午八点到下午十八点开启GigabitEthernet1/0/1和GigabitEthernet1/0/2开启端口,其它时间关闭端口,以便起到有效节能的作用。3、配置思路首先确保设备时间的准确性创建关闭GigabitEthernet1/0/1、Gigabit......