归纳总结一下执行上下文系列,其中包括了变量对象、作用域链和 this。本篇主要详细介绍执行上下文。
执行上下文(Execution Context,EC)可以理解为当前代码的运行环境。
在 javascript 中,运行环境主要分为全局环境、函数环境、eval。代码运行时最先进入的是全局环境,而函数被调用时进入函数环境。全局环境和函数环境所对应的执行上下文我们分别称为全局上下文和函数上下文。
注:这里 eval 目前已经不被推荐使用,所以在这里也不做多余介绍。
一个 javascript 文件中很可能会有多个函数被调用,也就是说在 javascript 代码运行中很可能会产生多个执行上下文,那么如何去管理这多个执行上下文呢?
执行上下文是以栈(一种后进先出的数据结构)的方式被存放起来的,我们称之为执行上下文栈(Execution Context Stack,ECS)。
javascript 代码一开始执行时最先进入到全局环境,此时全局上下文首先被创建并入栈,之后当调用函数时则进入相应的函数环境,此时相应函数上下文被创建并入栈,当处于栈顶的执行上下文代码执行完毕后,则会将其出栈。
所以在执行上下文栈中,栈底永远是全局上下文,而栈顶则是当前正在执行的函数上下文。
举个例子~
假设有一个 javascript 文件中包含如下代码
function fn2() {
console.log('fn2')
}
function fn1() {
console.log('fn1')
fn2();
}
fn1();
这里我们以数组来表示执行上下文栈 ECStack=[];
则上述代码运行过程中执行上下文栈的行为如下
/*伪代码*/
// 代码执行时最先进入全局环境,全局上下文被创建并入栈
ECStack.push(globalContext);
// fn1 被调用,fn1 函数上下文被创建并入栈
ECStack.push(<fn1> functionContext);
// fn1 中调用 fn2,fn2 函数上下文被创建并入栈
ECStack.push(<fn2> functionContext);
// fn2 执行完毕,fn2 函数上下文出栈
ECStack.pop();
// fn1 执行完毕,fn1 函数上下文出栈
ECStack.pop();
// 代码执行完毕,全局上下文出栈
ECStack.pop();
以一个更形象的图来说明上述的流程
执行上下文栈 ECStack.jpeg
在一个执行上下文中,最重要的三个属性分别是变量对象(Variable Object,VO)、作用域链(Scope Chain)和 this 指向。
我们可以采用如下方式表示
EC={
VO,
Scope,
this
}
从上面的叙述中,我们可以知道,一个执行上下文的生命周期分为创建和执行两个阶段。
创建阶段主要工作是生成变量对象、建立作用域链和确定 this 指向。
而执行阶段主要是变量赋值以及执行其它代码等。
那么关于执行上下文的大概介绍就到此为止了,下一篇会对执行上下文中的变量对象做详细的介绍。
网友评论