JS执行上下文
执行上下文有三种:全局执行上下文,函数执行上下文,eval 执行上下文(现在不会使用 eval,所以考虑)
-
全局执行上下文在页面首次加载是会被创建
-
函数执行上下文,当函数被调用的时候会被创建,当函数调用结束函数执行上下文会被销毁。 同一个函数被调用多次,会创建多个函数执行上下文
多个执行上下文 以执行上下文栈(执行栈)的形式存储,当函数被调用时,函数执行上下文入栈,当函数执行结束,函数执行上下文出栈。调用栈的底部是全局执行上下文
执行上下文创建三阶段:
- 绑定 this
- 创建词法环境
- 创建变量环境 词法环境存放 let、const 声明的变量 和 函数声明 变量环境存放 var 声明的变量
词法环境有环境记录和外部环境引入记录组成
全局执行上下文 和 函数执行上下文的环境记录不同:
- 全局执行上下文叫对象环境记录,
- 全局执行上下文叫声明性环境记录
全局执行上下文 和 函数执行上下文的外部环境引入记录不同:
- 全局执行上下文,由于没有引入外部环境,因此外部环境引入记录为 null
- 函数执行上下文,外部引入环境记录可能是全局环境 或者 其他函数环境
//全局执行上下文
GlobalExectionContext = {
// this绑定为全局对象
ThisBinding: '<Global Object>',
// 词法环境
LexicalEnvironment: {
//环境记录
EnvironmentRecord: {
Type: "Object", // 对象环境记录
// 标识符绑定在这里 let const创建的变量a b在这
a: < uninitialized >,
b: < uninitialized >,
multiply: < func >
}
// 全局环境外部环境引入为null
outer: <null>
},
VariableEnvironment: {
EnvironmentRecord: {
Type: "Object", // 对象环境记录
// 标识符绑定在这里 var创建的c在这
c: undefined,
}
// 全局环境外部环境引入为null
outer: <null>
}
}
// 函数执行上下文
FunctionExectionContext = {
//由于函数是默认调用 this绑定同样是全局对象
ThisBinding: '<Global Object>',
// 词法环境
LexicalEnvironment: {
EnvironmentRecord: {
Type: "Declarative", // 声明性环境记录
// 标识符绑定在这里 arguments对象在这
Arguments: {0: 20, 1: 30, length: 2},
},
// 外部环境引入记录为</Global>
outer: <GlobalEnvironment>
},
VariableEnvironment: {
EnvironmentRecord: {
Type: "Declarative", // 声明性环境记录
// 标识符绑定在这里 var创建的g在这
g: undefined
},
// 外部环境引入记录为</Global>
outer: <GlobalEnvironment>
}
}