在ES6中,每个块都与LexicalEnvironment
相关联,以支持该语言版本的块范围功能。
这是否意味着在ES6中为每个块实例化了一个新的ExecutionContext
?
参考:http://globaldev.co.uk/2013/09/es6-part-2/
例如(我故意使用函数范围的var
):
function foo() {
{
var foo; // Has a new ExecutionContext been instantiated here?
}
}
规范的相关位:https://people.mozilla.org/~jorendorff/es6-draft.html#sec-block-runtime-semantics-evaluation
答案 0 :(得分:3)
不,每个功能只有一个执行环境。 The LexicalEnvironment simply temporarily replaces the current LexicalEnvironment:
- 让 oldEnv 成为正在运行的执行上下文的LexicalEnvironment。
- 让 blockEnv 成为NewDeclarativeEnvironment(oldEnv)。 执行BlockDeclarationInstantiation(StatementList,blockEnv)。
- 将正在运行的执行上下文的LexicalEnvironment设置为 blockEnv 。
- 让 blockValue 成为评估StatementList的结果。
- 将正在运行的执行上下文的LexicalEnvironment设置为 oldEnv 。
- 返回 blockValue 。
醇>
答案 1 :(得分:0)
这是否意味着在ES6中实例化了一个新的ExecutionContext 每个街区?
不,我不相信这是事实。
根据我对规范的阅读,在执行块的过程中,当前LexicalEnvironment
的{{1}}暂时被为块实例化的ExecutionContext
替换。在控制离开块之前恢复LexicalEnvironment
。