之前了解的执行上下文为ES3版本,今天才得以了解ES5版本执行上下文。来自前端桃园博客,做个总结增强记忆理解,表达和深度尚有不足,请前往原文。
执行上下文与执行上下文栈引入
- js引擎执行一段代码时,会创建相应的执行上下文。包含this指向、代码中变量、函数的存储引用、上层执行上下文变量、函数的引用。
- 然后将执行上下文压入执行栈,执行代码。执行完毕时出栈,新的函数调用时新建执行上下文入栈。
- 最终执行完所有代码,全局执行上下文出栈,执行栈空栈。
ESStack[
globalContext,
func1Context,
func2Context
]
执行上下文
包含三个部分:this指向、词法环境、变量环境。(ES5的组成为变量对象、作用域链、this指向)。
this指向
老生常谈问题。
词法环境
词法环境存储let、const变量声明、函数声明、参数、外层执行上下文词法环境的引用,内含两个模块,分工存储。
环境记录器
- 分为对象环境记录器(函数上下文中)、对象环境记录器(全局上下文中)。
- 存储const、let变量声明、函数声明、参数。
- const、let声明变量在代码未执行赋值前值为< uninitialized >,未赋值时引用会报错。
外层上下文词法环境的引用
类似于作用域链。
变量环境
- 也是一种词法坏境,拥有词法环境所有的属性。
- 存储词法环境未存储的由var声明的变量,赋值前的值为“undefined”。
来源:前端桃园博客