前言
执行上下文中涉及的知识点其实很多,首先说一下执行上下文中涉及的概念有:
- 执行上下文(EC)
- 变量对象(VO)
- 活动对象(AO)
- 作用域链(scope chain)
- 执行上下文栈(ECS)
执行上下文
1、概念与分类
英文:Execution Context,又称执行环境,是指当前代码所处的执行空间,在js中执行上下文分为两类:
- 全局执行上下文
- 函数执行上下文(也可称之局部执行上下文)
全局执行上下文是所有代码默认进入的执行上下文,表示全局的执行环境
函数执行上下文是指在函数被调用时会创建一个执行上下文
2、创建时间
函数执行上下文是在函数调用时在函数内部代码执行前创建的
3、创建过程
执行上下文的建立分为两个过程:
1、创建过程
2、执行过程
创建过程具体完成的工作如下:
1、变量对象的创建,包括参数,函数内部的变量声明等
2、创建作用域链,就是scope chain的形成
3、this值的确定
-
变量对象的创建
就是VO的创建,这个过程函数的参数、arguments对象。同时会查找上下文中所有的函数声明和变量声明,绑定到给VO对象上。
我们知道Js中存在变量提升的概念,为什么会出现这个现象呢?实际上就是在创建在这个时期决定。
还有一点重要的是:函数声明的提升 优于 变量提升,同名的函数和变量,优先提升的是函数。 -
scope chain
实际上作用域链是指一系列变量对象的集合,包括当前VO以及上级作用域VO到全局VO。
作用域是为了查找变量以及限制变量的可使用范围
当我们使用变量时,js引擎会在当前作用域中查找VO,查看是否有相同标识符的变量,如果没有就会查找上级作用域VO中是否存在,依次类推至全局VO对象 -
this值的确定就不要说明了,就是确定this的指向
现在说一下VO和AO的区别以及联系:
联系:
两者本质相同,并且值也是相同的
区别:
状态不同,AO = 运行时 + VO,即运行时的变量对象
执行过程就是具体的代码执行了,不过对于执行会涉及到执行栈(ECS)的概念,何为执行栈呢?
就是执行上下文形成的栈结构
栈:实际上有三种概念,一指栈数据结构,二种调用栈,三种内存结构
这里执行栈表示的就是调用栈的概念。
就通过实例说明下执行栈:
function test1() {
function test2() {}
}
test1();
现在知道,调用函数会创建执行上下文,所有代码默认进入全局上下文中,所以此时执行栈结构如下:
栈是一种先进后出的结构,栈顶始终是当前执行上下文,当test2函数执行完后,test2执行上下文出栈,test1函数执行完后,test1执行上下文出栈,依次类推,直到全局执行上下文出栈。
实际上执行上下文还涉及到闭包问题,闭包问题体现在执行栈中就是存在闭包的函数所表示的执行上下文在该函数执行完后没有立即出栈。
明天总结prototype相关知识点,温故知新,致远行的你我。