执行栈: 也叫调用栈,用于储存代码执行期间的所有执行上下文,具有先进后出(LIFO)的结构,用于管理维护执行上下文
执行上下文: 是当前js代码被解析和执行时所在环境的抽象概念,js中代码都在上下文中执行

全局执行上下文会一直在栈底吗?
1 | 全局执行上下文不会一直在栈底,也就是在关闭页面才出栈是不对的. |
分两个阶段: 创建,执行阶段
执行阶段的词法环境和变量环境,都指向最初的词法环境对象,其中包含环境记录项和外部环境引用.
this绑定不属于词法环境,是执行环境中,执行上下文创建确定的.
注: 词法环境(词法环境对象),是一个用于定义特定变量和函数标识符在 ECMAScript 代码的词法嵌套结构上关联关系的规范类型。一个词法环境由一个环境记录项和可能为空的外部词法环境引用构成。参考1,参考2
ES6之前有VO(变量对象),AO(活动对象),scope(作用域链),this binding的说法.
VO,AO相当于词法环境和变量环境中的环境记录,函数声明变量声明阶段
this binding即确定this绑定
scope相当于可能为空的外部词法环境引用,实现作用域链
1 | ExecutionContext = { // 执行上下文 |
在全局和函数上下文中的表现:
1 | GlobalExectionContext = { // 全局执行上下文 |
也是一种词法环境,因此有同词法环境的属性
例:
1 | let a = 20; |
执行上下文如下
1 | GlobalExectionContext = { // 全局执行上下文 |
执行上下文创建阶段,函数声明在词法环境中已经完成,所以到执行阶段即可实现提升效果;
执行阶段,var声明会赋值undefined,而let,const不会赋值,是未初始化状态(暂时性死域),所以var会提升,let会报错
函数声明提升优先于变量提升
1 | alert(a); //输出:fn |
所有变量分配已完成,执行代码,如果之前声明的let没有值,会再次赋值undefined