执行上下文和执行栈
本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介:
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
- 执行上下文(Execution Context)
- 定义
- 执行上下文是JavaScript(以下简称JS)中一个非常重要的概念,它是代码在执行过程中所处的环境。可以把它想象成一个容器,这个容器里包含了代码执行时需要的所有信息,比如变量、函数声明、this指针的值等。
- 组成部分
- 变量对象(Variable Object):它是执行上下文中的一个重要组成部分,用来存储在当前执行上下文中定义的变量和函数声明。在函数执行上下文中,变量对象会被初始化为活动对象(Activation Object)。例如,在全局执行上下文中,变量对象就是全局对象(在浏览器环境中是window对象),它包含了像
document
、console
等全局变量和函数。
- 作用域链(Scope Chain):它决定了变量和函数的访问权限。作用域链是由当前执行上下文的变量对象和所有包含它的外层执行上下文的变量对象组成的一个链式结构。当在代码中访问一个变量时,JS引擎会沿着作用域链从内向外查找,直到找到这个变量或者到达最外层的全局作用域。例如,在一个函数内部访问一个变量,如果函数内部没有定义这个变量,就会沿着作用域链查找外层作用域中的变量。
- this指针的值:this指针的值在不同的执行上下文中是不同的。在全局执行上下文中,this指向全局对象(在浏览器环境中是window对象)。在函数执行上下文中,this的值取决于函数的调用方式。如果是作为对象的方法调用,this指向该对象;如果是通过
call
、apply
或bind
方法调用,this的值会根据这些方法的参数来确定;如果是作为普通函数调用,this在非严格模式下指向全局对象,在严格模式下为undefined
。
- 执行栈(Execution Stack)
- 定义
- 执行栈也叫调用栈(Call Stack),它是一种数据结构,用于管理函数的调用顺序。当代码开始执行时,会创建一个全局执行上下文并将其压入执行栈。每当一个函数被调用时,就会创建一个新的函数执行上下文并将其压入执行栈,当函数执行完毕后,这个函数的执行上下文就会从执行栈中弹出。
- 工作原理
- 执行上下文和执行栈的关系
- 执行栈是执行上下文的管理机制,它通过压入和弹出执行上下文来控制代码的执行顺序。每个执行上下文在执行栈中有自己的位置,并且它们之间存在着调用和返回的关系。当一个函数调用另一个函数时,新的函数执行上下文会被压入执行栈,这就体现了执行栈对执行上下文的管理作用。同时,执行上下文的创建和销毁也会影响执行栈的状态,例如,当一个函数执行完毕后,它的执行上下文从执行栈中弹出,执行栈的高度(即栈中执行上下文的数量)就会减少。这种关系确保了代码能够按照正确的顺序和环境进行执行。