JavaScript执行上下文生的命周期

JavaScript的执行上下文是代码执行的环境,它包含了变量、函数、作用域等信息,并决定了代码如何在不同的阶段(创建、执行、销毁)中运行。
可执行代码类型
JavaScript 的执行上下文环境,是代码运行时创建的,可执行代码类型有三类,如下:
-
🌍 全局代码
通过外部加载js文件、script标签内的代码
-
🔬 函数代码
function内部可执行代码
-
📝 eval代码
将string解析成可执行的代码,由字符内容、执行位置决定是函数、全局代码
上下文环境类型
上面介绍了“可执行代码类型”,执行可执行代码,会创建对应的上下文环境,类型如下:
-
🌍 全局上下文
即
windows对象,且this指向windows,一个程序中只有一个全局上下文。 -
🔬 函数上下文
函数被调用时,会创建一个对应的执行上下文环境,多个上下文环境,会按照创建顺序执行。
-
📝 eval上下文
上下文的生命周期
了解了 JavaScript 的“可执行代码类型”和“上下文环境类型”后,我们可以将执行上下文的生命周期划分为两个步骤。
👶 1.创建阶段
-
生成变量对象 (VO)
函数上下文的
变量对象初始化只包括Arguments对象变量对象与执行上下文相对应。在执行上下文创建阶段,以下变量依次存储在变量对象中。
-
函数形参
创建Arguments对象,有实参则建立属性、属性值关系,无实参则值为undefined。
-
函数声明
检查当前上下文函数声明(function关键字创建的函数),以函数名在变量对象中创建一个属性,属性指向该函数在内存中的引用地址。如果
变量对象中已寻在该名称,则直接替换该属性。 -
变量声明
检查当前上下文的变量声明,注册到变量对象中,属性默认为
undefined。如果变量声明与函数形参、函数声明冲突,则不干扰已存在的类型。
-
-
建立作用域链
JavaScript编译阶段,会确立作用域规则。
-
确定this指向
JavaScript中的this指针是动态的。
🏄 2.执行阶段
该阶段,JavaScript 会将函数的变量对象(VO)转为活动对象(AO)。所有的计算、逻辑操作、函数调用都会在这里完成。
- 变量赋值
例如 var let const
2. 函数引用
执行函数调用,并创建新的执行上下文。
3. 作用域链解析
从当前作用域位置开始,向上递归查找变量,若找不到,默认提示undefined,严格模式提示ReferenceError。
4. 执行其他代码
参考文档
本文参考、总结了以下文章,感谢相关作者的贡献。