一,执行上下文是一个栈级结构,并且随着函数的重复调用,会重复建立新的执行上下文。
二,变量对象(VO)是一个抽象概念中的“对象”,它用于储存执行上下文的变量,函数声明, 函数参数。
三,执行上下文可以认为是代码的执行环境。当代码被载入时,js解释器创建一个全局的执行上下文。当函数执行时,会创建函数的执行上下文。
js解释器的工作流程如下:
1.创建一个后进先出的执行上下文的栈;
2.接着创建全局的执行上下文,并压入栈中;
3.当调用函数时,会创建函数的执行上下文,并压入栈中;
4.当函数执行完毕,位于栈顶的函数执行上下文被弹出,并执行新的位于栈顶的执行上下文;
四,执行上下文的创建分为两个阶段:
1.创建阶段(将变量,函数声明以及函数参数组成一个活动对象VO(可变对象)(变量对象));
创建VO——》填充函数参数——》填充函数声明(冲突覆盖)——》填充变量声明(冲突忽略)
2.执行阶段(解释代码);
因此,变量和函数声明会被提前,并且函数表达式并不会被VO(相当于函数的激活对象AO)记录,
var e=function _e(){}//_e并不会记录在AO,故_e这个函数对象并不能在所在函数的作用域内被拿到
一些参考地址:https://segmentfault.com/a/1190000009522006
https://www.cnblogs.com/lin-js/p/5293418.html