执行环境
JS的执行上下文抽象的来说可以理解为JS所执行时的环境。
类似于学校的教室,老师同学要在里面执行教学任务,教室就是一个执行环境,JS的执行上下文就可以类比为JS的执行环境。
类别
全局执行上下文
进入script就会创建一个全局执行上下文,里面的变量对象就是window。 不在其他执行上下文的变量都在全局执行上下文中。 this指向window。 所有通过var定义的全局变量和函数都会成为window对象的属性和方法。
函数执行上下文
函数每次执行时都会创建一个函数执行上下文。 一个程序可以有多个函数执行上下文。
eval执行上下文
每个eval语句都会自动创建一个单独的执行上下文。
生命周期
(1)创建阶段
创建一个变量对象,上下文中所有的变量和函数都存在于这个对象上。
创建一个作用域链
函数上下文会初始化arguments
(2)执行阶段
创建变量对象的作用域链,该作用域链决定了各级执行上下文的代码在访问变量和函数时的顺序。
执行变量赋值、代码执行
(3)回收阶段
代码执行结束,上下文弹出上下文栈,指针指向上一个上下文(之前的),最终是指向全局上下文的
等待虚拟机回收。
变量声明
var
在使用var声明变量时,变量会自动添加到最接近的上下文,在函数中自然就是函数的上下文。如果变量未经声明就初始化了,就会自动添加到全局上下文。