javascript-执行上下文和执行栈

loading 2022年11月22日 63次浏览

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代码,就会创建一个全局执行上下文并压入栈中。

每当引擎碰到一个函数,它就会创建一个函数执行上下文,然后将这个上下文压入栈中。

引擎会执行栈顶的上下文,执行完后就弹出,然后执行下一个栈顶的上下文。