1.执行上下文
执行上下文是一种对js代码执行环境的抽象概念,只要有js代码运行,它就一定运行在执行上下文中。
执行上下文分为三种类型:
(1) 全局执行上下文
只有一个,浏览器中的全局对象就是window对象,this指向这个全局对象。
(2) 函数执行上下文
存在无数个,只有函数在被调用时才会被创建,每次调用函数会创建一个新的执行上下文。
(3) Eval函数执行上下文
运行在eval函数中的代码,很少用且不建议使用。
2. 生命周期
执行上下文的生命周期包括三个阶段:
2.1 创建阶段
创建阶段就是当函数被调用,但还未执行内部代码时。
创建阶段做了三件事:
-
确定this的值
-
词法环境被创建
词法环境包含全局环境和函数环境。
全局环境包含一个全局对象,this的值一开始指向这个全局对象。
用户在函数中定义的变量包含在环境记录中,包含了arguments对象。
- 变量环境被创建
变量环境也是一个词法环境,因此它具有上面定义的环境的所有属性。
和词法环境区别在于词法环境用于let和const绑定,变量环境用于var绑定。
2.2 执行阶段
执行变量赋值,代码执行等操作。
2.3 回收阶段
执行上下文出栈等待虚拟机回收执行上下文。
3. 执行栈
执行栈用于存储在代码执行期间创建的所有执行上下文。
当js引擎开始执行第一行script代码,就会创建一个全局执行上下文并压入栈中。
每当引擎碰到一个函数,它就会创建一个函数执行上下文,然后将这个上下文压入栈中。
引擎会执行栈顶的上下文,执行完后就弹出,然后执行下一个栈顶的上下文。