目录:
- 变量的执行环境(执行上下文)
- 执行上下文的生命周期
- 创建变量对象
- 变量的数据存储
- 变量的内存空间
- 变量的垃圾回收
- let/const/var的区别
执行环境(执行上下文)
javascript的运行环境主要包括以下三种:
- 全局环境:代码运行起来后会首先进入全局环境.
- 函数环境:当函数被调用时,会进入当前函数中执行代码.
- eval环境:不建议使用,这里不做介绍.
js运行环境也叫做执行上下文,因此在一个JavaScript程序中,必定会出现多个执行上下文.
JS引擎会以栈(遵循后进先出的数据存储方式)的方式来处理执行上下文,也就是我们通常所说的函数调用栈。栈底永远是全局上下文,栈顶则是当前正在执行的上下文. 处于栈顶的执行上下文执行完毕后,会自动出栈.
看个例子可能会更形象些:
function declare() {
var a = 1;
function update() {
a = 2;
}
update();
}
declare();
下面是上方用例中的执行上下文对应的进出栈流程示意图:
假如上方的 declare 函数处于全局环境中,那么代码运行时会经历以下几步:
- 首先第一步就是全局上下文入栈.
- 全局上下文入栈后,遇到的第一个可执行代码就是
declare()
函数的调用,此函数一旦调用,就会创建自己的执行上下文,此时declare EC
入栈. - 在新开辟的
declare EC
执行上下文中,执行内部的可执行代码,直到遇到update()
函数调用时,又会创建一个新的执行上下文,此时update EC
入栈. - 当
update EC
中的可执行代码执行完毕之后,发现不再有其他执行上下文生成的情况,此上下文会自动从栈中弹出. update EC
执行上下文弹出后,会继续执行declare EC
执行上下文中的可执行代码,直到顺利执行完毕,且没有遇到其他执行上下文,则自动从栈中弹出.- 最后执行栈中只剩下全局上下文,若浏览器不关闭,全局上下文会一直存在,直到浏览器窗口关闭,全局上下文才会最终出栈.
执行上下文的生命周期
说完执行上下文的入栈、出栈情况,下面说说执行上下文的生命周期.
当一个函数调用时,一个新的执行上下文就会被创建,一个执行上下文的生命周期可分为两个阶段:
- 创建阶段 : 此阶段执行上下文会分别创建变量对象、确认作用域链、以及确定
this
指向. - 执行阶段 : 执行代码,这个时候会完成变量赋值、函数引用、以及执行其他可执行代码等工作.
画个图看起来更直观: