JavaScript探究之执行上下文
JavaScript代码的执行过程分为两个阶段:
- 代码编译阶段,由编译器完成,将代码翻译成可执行代码
- 代码执行阶段,由引擎完成,主要任务是执行可执行代码
可执行代码分为三种:
- 全局代码
- 函数代码
- eval代码
一、执行上下文(EC)
当代码运行到一个环境时,就会进行“准备工作”,这里的“准备工作”称为“执行上下文”,也叫执行上下文环境,执行环境。
执行上下文的组成:
- 变量对象
- 作用域链
- this指针
二、执行上下文的生命周期
- 创建 生成变量对象,建立作用域链,确定this指向
- 执行 变量赋值,函数引用,执行其它代码
- 执行完出栈,等待销毁
三、变量对象的创建过程
- 创建arguements对象
- 检查function函数声明创建属性
- 检查var变量声明创建属性
四、变量对象和活动对象(Active Object)
变量对象和活动对象都是同一个对象,只是处于执行上下文的不同生命周期。
只有处于函数调用栈栈顶的执行上下文中的变量对象,才会变成活动对象。
五、作用域链和this指向
本质是一个指向当前环境与上层环境的一系列变量对象的指针列表(它只引用但不实际包含变量对象)。
作用域链保证了当前执行环境对符合访问权限的变量和函数的有序访问。
this指向的确定见另一篇文章。
六、总结
- 全局上下文在代码开始前就创建,在栈底部,浏览器窗口关闭时出栈
- 函数被调用时创建上下文环境
- 只有栈顶的上下文处于活动状态,执行其中代码