【执行上下文栈】
执行上下文栈存储代码执行阶段的所有上下文,具有LIFO先进后出特性
【ES3标准】
【GO/AO编译过程】
1. 先查看是否存在语法错误
2. 预编译
3. 解释一行执行一行
【预编译过程 -- 执行上下文创建阶段】
1. 创建GO/AO对象
2. 将形参与变量声明存放到GO/AO对象中,值为undefined
3. 将实参与形参统一
4. 将函数声明存放到GO/AO对象中
console.log(a);
function a() {
// 函数声明
}
var a = 1; // 变量声明
// 结果会输出函数声明
【ES5标准】
【执行上下文创建阶段】
1. 确定this指向
2. 创建词法环境组件
3. 创建变量环境组件
【创建词法环境组件】
=> 环境记录: 存储变量与函数声明的实际位置(函数上下文包含arguments对象)
PS:ES6中环境记录存储的变量只存储let与const声明的变量,而且赋值为uninitialized,未初始化
=> 对外部环境引入记录:保存自身环境可以访问的其他外部环境(全局上下文为null,函数上下文为全局环境)
【创建变量环境组件】
包含词法环境组件所有属性,包含环境记录与外部环境引入记录,但是在ES6中环境记录只记录var声明的变量,而且赋值为undefined
【参考文章】