# 深入理解JavaScript的执行流程
- 执行上下文EC
- 变量对象VO
- 活动对象AO
- 作用域Scope(链)
以上几个概念是JS解释引擎层面的概念,JS中无法直接访问。
执行上下文:
Execution Context,下文中简写为EC。(没找到一个官方的定义)个人理解是JS在运行时候记录JS运行的时候需要用到的各种属性等信息的一个对象,主要供JS引擎解析执行代码用。执行上下文中记录了Scope,VO|AO,this。也就是EC有3个重要的属性:Scope,VO|AO,this
有3种执行上下文:全局执行上下文,函数执行上下文,Eval 执行上下文。本文讲解前两种。
执行上下文栈:
Execution Context Stack,下文中简写为ECS。解释引擎记录执行上下文的容器。栈底是全局EC(全局EC只有在关闭该页面的时候才会出栈、销毁),栈顶是当前正在执行的EC。函数执行完之后会将栈顶EC出栈,将执行权交给下一个EC。
Scope:
作用域,是根据名称查找变量的一套规则,这套规则用来管理js引擎根据标识符名称如何查找变量。而一系列的嵌套作用域就形成了作用域链。作用域执行上下文的一个关键属性,以链的方式(底层实现到底是链表还是数组呢?)按顺序记录(持有)可访问的变量对象(函数中是活动对象)
VO:
变量对象 (Variable Object),存储了在上下文中定义的变量和函数声明;除了我们无法访问它外,和普通对象没什么区别。每一个执行上下文都有一个与之相关的变量对象,其中存储着上下文中声明的: 变量 VariableDeclaration VD,注意,必须是JS中以var声明的变量才会记录在这里。let或者const声明的变量不会存在这里。 函数 FunctionDeclaration FD,必须是显式声明的函数,函数表达式不会记录在这里(也就不会有提升)。
AO:
活动对象(Activation Object),在创建函数的时候初始化的一个对象,包含变量对象中的内容。除了上述VO中的变量、函数外,还包括函数 arguments 、参数parameters。AO = VO + function parameters + arguments。函数中不能访问VO,只能使用AO。
# 原理梳理
1,整体流程概览
JS解释引擎是边解析边执行的。JS解释引擎在载入一段脚本(进入任何一段
← 执行上下文栈 词法作用域和动态作用域 →