执行上下文
执行上下文可以理解为当前代码的执行环境,JavaScript中的运行环境大概包括三种情况。
- 全局环境:JavaScript代码运行起来会首先进入该环境
- 函数环境:当函数被调用执行时,会进入当前函数中执行代码
- eval(可忽略)
每一个函数执行时,都会给对应的函数创建这样一个执行上下文。
当 JavaScript 开始要解释执行代码的时候,最先遇到的就是全局代码,所以初始化的时候首先就会向执行上下文栈压入一个全局执行上下文,并且只有当整个应用程序结束的时候,全局执行上下文才会被清空。
执行上下文栈
- 在一个JavaScript程序中,必定会产生多个执行上下文。
- JavaScript引擎会以栈的方式来处理它们。
- 栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。
- 处于栈顶的上下文执行完毕之后,就会自动出栈。
- 当整个应用程序结束的时候,全局执行上下文才会被清空。
- 同步执行,只要栈顶的上下文处于执行中,其他上下文需要等待。
执行上下文的生命周期
创建阶段
在这个阶段中,执行上下文会分别创建变量对象,建立作用域链,以及确定this的指向。
创建变量对象
- 建立arguments对象。检查当前上下文中的参数,建立该对象下的属性与属性值。
- 检查当前上下文的函数声明,也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在,那么该属性将会被新的引用所覆盖。
- 检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为undefined。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性值不会被修改。
建立作用域链
作用域链是由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。
确定this指向
this的指向,是在函数被调用的时候确定的。也就是执行上下文被创建时确定的。(具体见javaScript学习笔记(四)——理解this)
执行阶段
- 变量赋值
- 函数引用
- 执行其他代码