在 V8 引擎中 JavaScript 代码的运行过程主要分成三个阶段:
- 语法分析阶段(该阶段会对代码进行语法分析,检查到代码语法错误,会在控制台抛出异常并终止执行)
- 编译阶段。 执行上下文创建(创建变量对象、建立作用域链、确定 this 的指向)。每个不同的运行环境,V8 引擎都会创建新的执行上下文。
- 执行阶段。 将编译阶段中创建的执行上下文压入调用栈,并成为正在运行的执行上下文,代码执行结束后,将其弹出调用栈
创建变量对象(Variable Object,简称 VO)
- 每个执行上下文都会有一个关联的变量对象,该对象上会保存这个上下文中定义的所有变量和函数
- 在浏览器中,全局环境的变量对象是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。
- 在 Node 中全局环境的变量对象则是global对象
- 在 JavaScript 中环境分,词法环境(Lexical Environment)和变量环境(Variable Environment)两种
- 变量环境用来记录var/function等变量声明
- 词法环境是用来记录let/const/class等变量声明
建立作用域链(Scope Chain)
通过外部词法环境的引用,作用域可以层层拓展,建立起从里到外延伸的一条作用域链。当某个变量无法在自身词法环境记录中找到时,可以根据外部词法环境引用向外层进行寻找,直到最外层的词法环境中外部词法环境引用为null,这便是作用域链的变量查询。