每个代理(agent)最多只有一个正在执行代码的执行上下文。这被称为代理的运行执行上下文(running execution context)。
执行上下文栈用于跟踪执行上下文。正在运行的执行上下文始终是此堆栈的顶层元素。每当从与当前运行的执行上下文相关联的可执行代码转移到与该执行上下文不相关的可执行代码时新的执行上下文被创建。新创建的执行上下文被压入堆栈并成为正在运行的执行上下文。
用代码加步骤说明:
1. var a='running execution context';
2. function foo(){
3. console.log('new running execution context');4.
4. }
5.
6. foo();
7. console.log(a);
我把全局的执行上下文记为ec1,
我把foo函数的执行上下文记为ec2,
执行上下文栈记为recList;
正在运行的执行上下文rec
- 首先recList是空的,rec=recList[0]。
- 运行全局代码时ec1被创建,并unshift到recList中,recList=[ec1],rec=recList[0]。
- 当执行到第6句,进入foo函数里时,ec2被创建并unshift到recList中,recList=[ec2,ec1],rec=recList[0]。
- foo函数执行完毕,recList.shift(),ec2从recList中删除,recList=[ec1],rec=recList[0]。
- 到第7句执行完毕,ec1从recList中删除,recList又变为空了,rec=recList[0]。
在这里我们可以看到执行上下文之间的转换通常以堆栈式的后进/先出(LIFO)方式进行。
所有执行上下文都有下表的组件:
组件 | 含义 |
---|---|
代码评估状态 | 任何需要去执行,暂停和恢复与此执行上下文相关的代码评估状态。 |
Function | 如果这个执行上下文正在评估一个函数对象的代码,那么这个组件的值就是那个函数对象。如果上下文正在评估脚本或模块的代码,则该值为空。 |
Realm | 关联代码访问ECMAScript资源的领域记录。 |
ScriptOrModule | 模块记录(Module Record)或脚本记录(Script Record)相关代码的来源。如果不存在来源的脚本或模块,则值为null。 |
正在运行的执行上下文的Realm组件的值也被称为当前的Realm Record。正在运行的执行上下文的Function组件的值也被称为活动函数对象。
ECMAScript代码的执行上下文具有下表列出的其他状态组件。
组件 | 含义 |
---|---|
LexicalEnvironment | 标识在此执行上下文中用于解析有代码所做的标识符引用的词法环境。 |
VariableEnvironment | 标识在此执行上下文中的词法环境,它的环境记录保存了由VariableStatements创建的绑定。 |
当创建执行上下文时,它的LexicalEnvironment和VariableEnvironment组件最初具有相同的值。