执行上下文是一种对js执行代码的环境的一种
抽象
,只要js在执行中,那它一定是运行在执行上下文中
执行上下文的类型
eval
函数中的代码,很少用而且不建议使用示例
执行上下文的生命周期为:创建阶段 —> 执行阶段 —> 销毁阶段
具体包含三件事
执行上下文对象
伪代码
//执行上下文对象
const executionContext = {
//确定this值
ThisBindings = { .....},
//创建词法环境
LexicalEnvironment = { ....},
//创建变量环境
VariableEnvironment = { ....},
}
this
的值是在执行时(运行时)确定的,而不是在执行上下文创建时确定的。这意味着this
的绑定是动态的,取决于代码的实际执行情况。
词法环境(Lexical Environment)是 JavaScript 中的一个重要概念,用于管理变量和函数的词法作用域
环境记录(Environment Record):环境记录是一个存储变量和函数声明的地方。它可以看作是一个字典或映射,将标识符(如变量名、函数名)映射到对应的值。环境记录有以下两种主要类型:
GlobalExectionContext = { // 全局执行上下文
LexicalEnvironment: { // 词法环境
EnvironmentRecord: { // 环境记录
Type: "Object", // 全局环境
// 标识符绑定在这里
outer: <null> // 对外部环境的引用
}
}
FunctionExectionContext = { // 函数执行上下文
LexicalEnvironment: { // 词法环境
EnvironmentRecord: { // 环境记录
Type: "Declarative", // 函数环境
// 标识符绑定在这里 // 对外部环境的引用
outer: <Global or outer function environment reference>
}
}
记录
Object Environment Record
,对象环境记录Declarative Environment Record
,声明式环境记录变量环境实际上是词法环境的一个子集
let
和const
)的绑定伪代码
let a = 10
const b = 100
var c = 20
function sum (number1, numebr2)
{
var res = 0
return res + number1 + number2
}
c = sum(20, 30)
执行上下文对象
GlobalExectionContext = {
ThisBinding: <Global Object>,
LexicalEnvironment: { // 词法环境
EnvironmentRecord: {
Type: "Object",
// 标识符绑定在这里
a: < uninitialized >,
b: < uninitialized >,
sum: < 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",
// 标识符绑定在这里
res: undefined
},
outer: <GlobalLexicalEnvironment>
}
}
全局执行上下文对象
uninitialized
(未初始化状态)undefined
函数执行上下文对象
执行栈
中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');
执行上下文的创建和销毁是一个动态的过程,由 JavaScript 引擎负责管理。执行上下文的栈结构(调用栈)用于跟踪代码的执行顺序,并确保上下文按照正确的顺序进入和离开。这种生命周期管理有助于确保变量的作用域、函数的调用顺序和内存资源的释放都得以正确执行。